在groupby之后获取Pandas DataFrame中的数据

时间:2017-12-03 18:32:56

标签: python pandas dataframe

我有一个DataFrame df,其中包含有关元素的信息,例如:

df = pd.DataFrame([[1,45,12],[1,8,13],[1,3,4],[2,5,1],[2,7,3]], 
                  columns=['group', 'value1', 'value2'])

我使用了类似dfGroups = df.groupby('group').apply(my_agg).reset_index()的内容,所以现在我有dfgroup,比如说

dfGroup = pd.DataFrame([[1,4],[2,27]], 
                      columns=['group', 'valuegroup'])

现在我需要将组信息带回元素,以便能够构建新的列,同时考虑元素数据和组数据。因此,为了简单起见,我要说我需要在valuegroup个相同的df数据中构建dfGroup列。所以我会得到

    group   value1  value2  valuegroup
0   1       45      12      4
1   1       8       13      4
2   1       3       4       4
3   2       5       1       27
4   2       7       3       27

最好的方法是什么? (如果可能的话,可以使用Python 2和3的东西)

2 个答案:

答案 0 :(得分:1)

我认为你需要transform

df['new'] = df.groupby('group')['value'].transform(my_agg)

merge

df = pd.merge(df, dfGroup, on='group', how='left')
print (df)
   group  value1  value2  valuegroup
0      1      45      12           4
1      1       8      13           4
2      1       3       4           4
3      2       5       1          27
4      2       7       3          27

或者,如果可以省略reset_index,请使用join

dfGroups = df.groupby('group').apply(my_agg)
df = df.join(dfGroups, on='group')

样品:

dfGroup = pd.DataFrame([4,27], 
                      columns=['valuegroup'], index=[1,2])

print (dfGroup)
   valuegroup
1           4
2          27

df = df.join(dfGroup, on='group')
print (df)
   group  value1  value2  valuegroup
0      1      45      12           4
1      1       8      13           4
2      1       3       4           4
3      2       5       1          27
4      2       7       3          27

答案 1 :(得分:1)

df.set_index('group', inplace=True)
dfGroup.set_index('group', inplace=True)
df['valuegroup'] = dfGroup['valuegroup']