Pandas 按 groupby 求和,但排除某些列
Pandas sum by groupby, but exclude certain columns
在 Pandas 数据框上进行 groupby,但从该 groupby 中排除某些列的最佳方法是什么?例如我有以下数据框:
Code Country Item_Code Item Ele_Code Unit Y1961 Y1962 Y1963
2 Afghanistan 15 Wheat 5312 Ha 10 20 30
2 Afghanistan 25 Maize 5312 Ha 10 20 30
4 Angola 15 Wheat 7312 Ha 30 40 50
4 Angola 25 Maize 7312 Ha 30 40 50
我想按 Country 和 Item_Code 列进行分组,并且只计算属于 Y1961、Y1962 和 Y1963 列的行的总和。生成的数据框应如下所示:
Code Country Item_Code Item Ele_Code Unit Y1961 Y1962 Y1963
2 Afghanistan 15 C3 5312 Ha 20 40 60
4 Angola 25 C4 7312 Ha 60 80 100
现在我正在这样做:
df.groupby('Country').sum()
然而,这也会将 Item_Code 列中的值相加。有什么方法可以指定要在 sum()
操作中包含哪些列以及要排除哪些列?
agg
函数将为您完成此操作。传递列并作为带有列的字典运行,输出:
df.groupby(['Country', 'Item_Code']).agg({'Y1961': np.sum, 'Y1962': [np.sum, np.mean]}) # Added example for two output columns from a single input column
这将仅显示分组依据列和指定的聚合列。在这个例子中,我包含了两个应用于 'Y1962'.
的聚合函数
为了准确获得您希望看到的内容,将其他列包括在分组依据中,并将总和应用于框架中的 Y 变量:
df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})
您可以select groupby 的列:
In [11]: df.groupby(['Country', 'Item_Code'])[["Y1961", "Y1962", "Y1963"]].sum()
Out[11]:
Y1961 Y1962 Y1963
Country Item_Code
Afghanistan 15 10 20 30
25 10 20 30
Angola 15 30 40 50
25 30 40 50
请注意,传递的列表必须是列的子集,否则您将看到 KeyError。
如果您正在寻找一种更通用的方法来应用于许多列,您可以做的是构建一个列名列表并将其作为分组数据框的索引传递。例如,在您的情况下:
columns = ['Y'+str(i) for year in range(1967, 2011)]
df.groupby('Country')[columns].agg('sum')
在 Pandas 数据框上进行 groupby,但从该 groupby 中排除某些列的最佳方法是什么?例如我有以下数据框:
Code Country Item_Code Item Ele_Code Unit Y1961 Y1962 Y1963
2 Afghanistan 15 Wheat 5312 Ha 10 20 30
2 Afghanistan 25 Maize 5312 Ha 10 20 30
4 Angola 15 Wheat 7312 Ha 30 40 50
4 Angola 25 Maize 7312 Ha 30 40 50
我想按 Country 和 Item_Code 列进行分组,并且只计算属于 Y1961、Y1962 和 Y1963 列的行的总和。生成的数据框应如下所示:
Code Country Item_Code Item Ele_Code Unit Y1961 Y1962 Y1963
2 Afghanistan 15 C3 5312 Ha 20 40 60
4 Angola 25 C4 7312 Ha 60 80 100
现在我正在这样做:
df.groupby('Country').sum()
然而,这也会将 Item_Code 列中的值相加。有什么方法可以指定要在 sum()
操作中包含哪些列以及要排除哪些列?
agg
函数将为您完成此操作。传递列并作为带有列的字典运行,输出:
df.groupby(['Country', 'Item_Code']).agg({'Y1961': np.sum, 'Y1962': [np.sum, np.mean]}) # Added example for two output columns from a single input column
这将仅显示分组依据列和指定的聚合列。在这个例子中,我包含了两个应用于 'Y1962'.
的聚合函数为了准确获得您希望看到的内容,将其他列包括在分组依据中,并将总和应用于框架中的 Y 变量:
df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})
您可以select groupby 的列:
In [11]: df.groupby(['Country', 'Item_Code'])[["Y1961", "Y1962", "Y1963"]].sum()
Out[11]:
Y1961 Y1962 Y1963
Country Item_Code
Afghanistan 15 10 20 30
25 10 20 30
Angola 15 30 40 50
25 30 40 50
请注意,传递的列表必须是列的子集,否则您将看到 KeyError。
如果您正在寻找一种更通用的方法来应用于许多列,您可以做的是构建一个列名列表并将其作为分组数据框的索引传递。例如,在您的情况下:
columns = ['Y'+str(i) for year in range(1967, 2011)]
df.groupby('Country')[columns].agg('sum')