我有一个类似下面的df,(前两行是文本,第一列是日期)
In [4]: df
Out[4]:
test bs dv if ir md qb sy tb
0 TESTacc a10900 a10900 a10900 IJJMKK11 a10900 a10900 a10900 a10900
1 01-Feb-2019 18.8668013 4.6021207 0.9330807 13.9766832 2.9002571 0.2824343 0.8280988 0.8587644
2 04-Feb-2019 16.187526 3.1000162 0.4145835 14.6465183 2.848472 0.2516608 0.8618771 0.218063
我需要以3位小数精度获得此csv 另外,我需要添加“总计”列(最右边的列) 我已经尝试了以下方法,但是这些方法不合适
要添加我所做的总计列:
ndf=df.iloc[2:,1:] #take only numerics in ndf
ndf = ndf.apply(pd.to_numeric)
ndf=ndf.round(3)
df['total']=ndf.sum(axis=1)
这不是执行简单操作(例如添加总计列)的正确方法
所以我尝试了
df=df.apply(pd.to_numeric,errors='ignore')
但回合仍然无法在df上使用
我的意图是仅添加总计列,并将所有数字四舍五入到小数点后3位。
附加:完成此操作后,我将最后一行添加为中值行,每列具有中值
答案 0 :(得分:1)
根据最新的pandas文档1.0.3,您只能使用以下代码对数字列求和:
df_sum = df.sum(numeric_only = True)
这将求和df中的所有数字列,并将其分配给变量df_sum。
链接到最新文档 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sum.html
答案 1 :(得分:0)
IIUC,您可能需要:
df['sum']=df.apply(lambda x: pd.to_numeric(x,errors='coerce')).sum(axis=1).round(3)
#for median: df.apply(lambda x: pd.to_numeric(x,errors='coerce')).median(axis=1).round(3)
print(df)
test bs dv if ir md \
0 TESTacc a10900 a10900 a10900 IJJMKK11 a10900
1 01-Feb-2019 18.8668013 4.6021207 0.9330807 13.9766832 2.9002571
2 04-Feb-2019 16.187526 3.1000162 0.4145835 14.6465183 2.848472
qb sy tb sum
0 a10900 a10900 a10900 0.000
1 0.2824343 0.8280988 0.8587644 43.248
2 0.2516608 0.8618771 0.218063 38.529
EDIT ,您可以使用df.where()
将所有中性数字四舍五入为:
df['sum']=df.apply(lambda x: pd.to_numeric(x,errors='coerce')).sum(axis=1)
df=(df.where(df.apply(lambda x: pd.to_numeric(x,errors='coerce')).isna(),
df.apply(lambda x: pd.to_numeric(x,errors='coerce')).round(3)))
print(df)
test bs dv if ir md qb sy \
0 TESTacc a10900 a10900 a10900 IJJMKK11 a10900 a10900 a10900
1 01-Feb-2019 18.867 4.602 0.933 13.977 2.9 0.282 0.828
2 04-Feb-2019 16.188 3.1 0.415 14.647 2.848 0.252 0.862
tb sum
0 a10900 0.000
1 0.859 86.496
2 0.218 77.057