将任意函数应用于Pandas框架groupby

eqqqjvef  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(78)

如何将任意函数group-wise应用于Pandas嵌套框架?该函数应该能够一次访问整个组df,就像它是一个完整的Pandas嵌套框架一样。

import pandas as pd
def arbitrary_function(df):
    """This function acts on groups of a df. It can see every row and column of a group df."""
    # for example
    # making a new column by accessing other columns in the df
    df['new_col'] = df['data_col'].sum()
    # return the original df with the new column
    return df
df = pd.DataFrame([[1, 2], [1, 3], [2, 6], [2, 1]], columns=["group_col", "data_col"])

字符串
组操作前:

df
   group_col  data_col
0          1         2
1          1         3
2          2         6
3          2         1
# group the dataframe by group_col
# run arbitrary_function() on the df groups
# the first run of arbitrary_function can see one group df as such:
#    group_col  data_col
# 0          1         2
# 1          1         3
# return to the original data - no more groups

预期产出:

df
   group_col  data_col new_col
0          1         2       5
1          1         3       5
2          2         6       7
3          2         1       7


应做到这一点:
1.没有lambda函数。
1.没有将问题“简化”为可以通过列或元素操作来完成的问题。这个解决方案应该可以推广到你可以在pandas框架上做的任何事情。

p5cysglq

p5cysglq1#

由于你在函数中返回一个完整的 Dataframe ,你可以简单地concat函数的结果,以避免使用groupby_apply处理额外的索引:

out = pd.concat([arbitrary_function(subdf) for _, subdf in df.groupby('group_col')])

字符串
输出量:

>>> out
   group_col  data_col  new_col
0          1         2        5
1          1         3        5
2          2         6        7
3          2         1        7

相关问题