【发布时间】: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() 的行为。
【问题讨论】: