首页 > 解决方案 > 从第一列开始选择小数(非舍入)到 Pandas DataFrame 后的一定位数 - Python

问题描述

我只是想为从第 1 列(python index-0)开始的 pandas 数据框中的数据选择小数点后的一定位数(5 位)而不进行四舍五入

例如,我的熊猫看起来像这样

ids       value1     value2       value3       value4
ex12    0.1345656    0.1345656   0.1345656   0.1345656
ex13    0.1345656    0.1345656   0.1345656   0.1345656
ex14    0.1345656    0.1345656   0.1345656   0.1345656
ex15    0.1345656    0.1345656   0.1345656   0.1345656

我希望它被转换成这个新的结果数据框:

 ids       value1     value2       value3       value4
ex12    0.13456    0.13456   0.13456   0.13456
ex13    0.13456    0.13456   0.13456  0.13456
ex14    0.13456    0.13456   0.13456   0.13456
ex15    0.13456   0.13456   0.13456   0.13456

所以第一列(ids)不应该被转换触及,效果应该只从下一列开始发生。

这是我在 Python 中的代码尝试:

import pandas as pd
data = [['ex12', 0.1345656, 0.1345656, 0.1345656 , 0.1345656], 
        ['ex13', 0.1345656, 0.1345656, 0.1345656 , 0.1345656],
        ['ex14', 0.1345656, 0.1345656, 0.1345656 , 0.1345656],
        ['ex15', 0.1345656, 0.1345656, 0.1345656 , 0.1345656]
       ]
df
ids   values1    value2    value3    value4
0  ex12  0.134566  0.134566  0.134566  0.134566
1  ex13  0.134566  0.134566  0.134566  0.134566
2  ex14  0.134566  0.134566  0.134566  0.134566
3  ex15  0.134566  0.134566  0.134566  0.134566

当我将其转换为字符串数据类型时它不起作用,因此我可以将它们作为字符串处理(对它们进行切片)。但是,当我这样做时,生成的转换是按行而不是按列的,并且该操作对其余列的执行也不相同。有没有办法在熊猫中做到这一点?

df.apply(str).apply(lambda x: x[:12])
ids        0    ex12\n1 
values1     0    0.13456
value2      0    0.13456
value3      0    0.13456
value4      0    0.13456
dtype: object

非常感谢你。

标签: pythonpandasdataframe

解决方案


对于一列,您可以试试这个

(df.value1 * 1e5).astype(int) / 1e5

Out[193]:
0    0.13456
1    0.13456
2    0.13456
3    0.13456
Name: value1, dtype: float64

对于您可以使用的所有列apply

df.iloc[:,1:].apply(lambda x: (x * 1e5).astype(int) / 1e5)

Out[197]:
    value1   value2   value3   value4
0  0.13456  0.13456  0.13456  0.13456
1  0.13456  0.13456  0.13456  0.13456
2  0.13456  0.13456  0.13456  0.13456
3  0.13456  0.13456  0.13456  0.13456

放回您的数据框。利用update

df.update(df.iloc[:,1:].apply(lambda x: (x * 1e5).astype(int) / 1e5))

print(df)

Output:
    ids   value1   value2   value3   value4
0  ex12  0.13456  0.13456  0.13456  0.13456
1  ex13  0.13456  0.13456  0.13456  0.13456
2  ex14  0.13456  0.13456  0.13456  0.13456
3  ex15  0.13456  0.13456  0.13456  0.13456

如果要创建新数据框,请使用join

df_new = df.iloc[:,[0]].join(df.iloc[:,1:]
                               .apply(lambda x: (x * 1e5).astype(int) / 1e5))

Out[210]:
    ids  values1   value2   value3   value4
0  ex12  0.13456  0.13456  0.13456  0.13456
1  ex13  0.13456  0.13456  0.13456  0.13456
2  ex14  0.13456  0.13456  0.13456  0.13456
3  ex15  0.13456  0.13456  0.13456  0.13456

推荐阅读