Pandas数据帧组:总和一列,从其他列中取出第一个元素

时间:2017-09-19 15:07:43

标签: python pandas dataframe group-by

我有一个pandas数据帧

x = pd.DataFrame.from_dict({'row':[1, 1, 2, 2, 3, 3, 3], 'add': [1, 2, 3, 4, 5, 6, 7], 'take1': ['a', 'b', 'c', 'd', 'e', 'f', 'g'], 'take2': ['11', '22', '33', '44', '55', '66', '77'], 'range': [100, 200, 300, 400, 500, 600, 700]})


   add  range  row take1 take2
0    1    100    1     a    11
1    2    200    1     b    22
2    3    300    2     c    33
3    4    400    2     d    44
4    5    500    3     e    55
5    6    600    3     f    66
6    7    700    3     g    77

我希望按row列对其进行分组,然后在add列中添加条目,但是从take1take2获取第一个条目,然后选择最小值和最大值范围:

   add    row take1 take2  min_range   max_range
0    3      1     a    11    100        200
1    7      2     c    33    300        400
2    18     3     e    55    500        700

2 个答案:

答案 0 :(得分:2)

按dict使用DataFrameGroupBy.agg,但之后需要进行一些清理,因为在列中获取MultiIndex

#create a dictionary of column names and functions to apply to that column

d = {'add':'sum', 'take1':'first', 'take2':'first', 'range':['min','max']}

#group by the row column and apply the corresponding aggregation to each 
#column as specified in the dictionary d
df = x.groupby('row', as_index=False).agg(d)

#rename some columns
df = df.rename(columns={'first':'', 'sum':''})
df.columns = ['{0[0]}_{0[1]}'.format(x).strip('_') for x in df.columns] 
print (df)
   row take1  range_min  range_max take2  add
0    1     a        100        200    11    3
1    2     c        300        400    33    7
2    3     e        500        700    55   18

详细信息:根据字典中指定的函数聚合列:

df = x.groupby('row', as_index=False).agg(d)
row range      take2 take1 add
        min  max first first sum
0   1   100  200    11     a   3
1   2   300  400    33     c   7
2   3   500  700    55     e  18

使用sum替换列名first''将导致

 row range      take2 take1 add
        min  max                
0   1   100  200    11     a   3
1   2   300  400    33     c   7
2   3   500  700    55     e  18

使用字符串格式化列表对列的理解将获得所需的列名。将其分配给df.columns将获得所需的输出。

答案 1 :(得分:0)

这里是我的,没有列重命名/排序。

x = pd.DataFrame.from_dict({'row':[1, 1, 2, 2, 3, 3, 3], 'add': [1, 2, 3, 4, 5, 6, 7], 'take1': ['a', 'b', 'c', 'd', 'e', 'f', 'g'], 'take2': ['11', '22', '33', '44', '55', '66', '77'], 'range': [100, 200, 300, 400, 500, 600, 700]})
x.reset_index(inplace = True)
min_cols = x.ix[x.groupby(['row'])['index'].idxmin().values][['row','take1','take2']]
x_grouped = x.groupby(['row']).agg({'add':'sum','range':[np.min, np.max]})

x_out = pd.merge(x_grouped,min_cols, how = 'left',left_index = True, right_on = ['row'])

print x_out


   (add, sum)  (range, amin)  (range, amax)  row take1 take2
0           3            100            200    1     a    11
2           7            300            400    2     c    33
4          18            500            700    3     e    55