【问题标题】:Adding goupby transform result to an existing pandas DataFrame with each row representing a group将转换结果分组添加到现有的 pandas DataFrame 中,每行代表一个组
【发布时间】:2016-12-05 18:12:40
【问题描述】:

TL;DR - 我想模仿 DataFrameGroupBy.std() 等函数的行为

我有一个我分组的 DataFrame。 我想用一行来表示每个组,然后将有关这些组的额外统计信息添加到生成的 DataFrame 中(例如这些组的均值和标准差)

这是我的意思的一个例子:

df = pandas.DataFrame({"Amount": [numpy.nan,0,numpy.nan,0,0,100,200,50,0,numpy.nan,numpy.nan,100,200,100,0], 
                          "Id": [0,1,1,1,1,2,2,2,2,2,2,2,2,2,2],
                          "Date": pandas.to_datetime(["2011-11-02","NA","2011-11-03","2011-11-04",
                                                      "2011-11-05","NA","2011-11-04","2011-11-04",
                                                     "2011-11-06","2011-11-06","2011-11-06","2011-11-06",
                                                     "2011-11-08","2011-11-08","2011-11-08"],errors='coerce')})

    g = df.groupby("Id")
    f = g.first()
    f["std"] = g.Amount.std()

现在,这可行 - 但假设我想要一个特殊的 std,它会忽略 0,并且只考虑每个唯一值一次:

def get_unique_std(group):
    vals = group.unique()
    vals = vals[vals>0]
    return vals.std() if vals.shape[0] > 1 else 0

如果我使用

f["std"] = g.Amount.transform(get_unique_std)

我只得到零...(也适用于任何其他功能,例如 max 等)

但如果我这样做:

std = g.Amount.transform(get_unique_std)

我得到了正确的结果,只是不再分组......我想我可以在获取组的代表行之前将所有这些计算到原始 DataFrame 的列中(在本例中为 df):

df["std"] = g.Amount.transform(get_unique_std)
# regroup again the modified df
g = df.groupby("Id")
f = g.first()

但这只会浪费内存空间,因为对应于同一组的许多行将获得相同的值,而且我还必须将 df 分组两次 - 一次用于计算这些统计信息,第二次用于获取代表行...

所以,如开头所述,我想知道如何模仿 DataFrameGroupBy.std() 的行为。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我想你可能正在寻找DataFrameGroupBy.agg()

    您可以像这样传递自定义函数并获得分组结果:

    g.Amount.agg(get_unique_std)
    

    您还可以传递字典并将每个键作为一列获取:

    g.Amount.agg({'my_std': get_unique_std, 'numpy_std': pandas.np.std})
    

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 2021-08-18
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多