Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在panda dataframe和dask dataframe中只计算选定的列?_Python_Pandas_Dataframe_Dask - Fatal编程技术网

Python 如何在panda dataframe和dask dataframe中只计算选定的列?

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

我有一个数据帧,我想计算每行的非零列,以及dask和pandas中所选行的总和

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']
同样有效。如果您需要详细信息,可以在此处阅读: