Python 如何在panda dataframe和dask dataframe中只计算选定的列?
我有一个数据帧,我想计算每行的非零列,以及dask和pandas中所选行的总和Python 如何在panda dataframe和dask dataframe中只计算选定的列?,python,pandas,dataframe,dask,Python,Pandas,Dataframe,Dask,我有一个数据帧,我想计算每行的非零列,以及dask和pandas中所选行的总和 id Car Model 1.1 2.1 3.1 4.1 1 BMW Model1 2 5 2 0 2 Volvo V1
id Car Model 1.1 2.1 3.1 4.1
1 BMW Model1 2 5 2 0
2 Volvo V1 0 0 10 3
3 VW Polo 5 2 4 5
所以我需要在输出中增加2列,这将给出非零值的计数和所选列的总和
所需的输出如下:
id Car Model 1.1 2.1 3.1 4.1 Count Sum
1 BMW Model1 2 5 2 0 3 9
2 Volvo V1 0 0 10 3 2 13
3 VW Polo 5 2 4 5 4 16
In [85]: df[['sum', 'count']] = df[['1.1', '2.1', '3.1', '4.1']].apply(custom_agg, axis=1)
In [86]: df
Out[86]:
Car Model 1.1 2.1 3.1 4.1 sum count
id
1 BMW Model1 2 5 2 0 9 3
2 Volvo V1 0 0 10 3 13 2
3 VW Polo 5 2 4 5 16 4
我想我可以使用
df.fillna(0).astype(bool).sum(axis=1)
,但我只需要在所选列上使用它,正如您在所需输出中看到的那样。此外,我如何在dask中获得类似的结果?您需要做的是在每一行上循环并应用求和聚合函数。这就是apply
的用途
您只需返回一个序列,其中包含每行所需的值sum
是显而易见的,而count
本质上与您的想法相同<代码>s=0返回True
或False
和sum()
仅考虑True
In [83]: def custom_agg(s):
...: return pd.Series({'sum': s.sum(), 'count': (s!=0).sum()})
然后像这样应用它:
id Car Model 1.1 2.1 3.1 4.1 Count Sum
1 BMW Model1 2 5 2 0 3 9
2 Volvo V1 0 0 10 3 2 13
3 VW Polo 5 2 4 5 4 16
In [85]: df[['sum', 'count']] = df[['1.1', '2.1', '3.1', '4.1']].apply(custom_agg, axis=1)
In [86]: df
Out[86]:
Car Model 1.1 2.1 3.1 4.1 sum count
id
1 BMW Model1 2 5 2 0 9 3
2 Volvo V1 0 0 10 3 13 2
3 VW Polo 5 2 4 5 16 4
Dask工具适用。代码应该在pandas和Dask开箱即用模式下工作。对行使用apply函数
import pandas as pd
import numpy as np
d = {'Car': ['BMW', 'Volvo'], 'Model': ['Model1', 'V1']}
df = pd.DataFrame(data=d)
df['1.1'] = [2,0]
df['2.1'] = [5,0]
df['3.1'] = [2,10]
df['4.1'] = [0,3]
values = df.iloc[:,2:]
df['sum'] = values.apply(np.sum, axis=1)
df['count'] = values.astype(bool).sum(axis=1)
print(df.head)
Car Model 1.1 2.1 3.1 4.1 sum count
0 BMW Model1 2 5 2 0 9 3
1 Volvo V1 0 0 10 3 13 2
@耶斯雷尔,你能帮忙吗?谢谢你的回答。有没有办法定义我需要计算的选定列?有些列也有整数值,我不需要在聚合中使用它们。
df[['1.1','2.1','3.1','4.1']]
已经在这样做了。此代码将忽略汽车
和车型
以及您可能拥有的任何其他内容。如果你想计算更多的列,你可以在这个列表中添加一些东西。好的,我没有注意到。谢谢我可以基于聚合中的切片选择列吗?我有300多列,我不想按名称选择。如果我能把它们切成片就好了是的,你能df.loc[:,'1.1':'4.1']
同样有效。如果您需要详细信息,可以在此处阅读: