我正在尝试使用GroupBy对DataFrame进行描述性统计,然后将这些值放回DataFrame中。
我的DataFrame包含一个非唯一的运行编号(用于匿名标识一个人),以及一些与每个人相关的值。
例如:
RunNr Value
1 126
1 158
1 18
2 65
3 31
3 4
通过使用GroupBy,我可以计算每个人(运行号码)的描述性统计数据,如标准差。我想将它们重新添加到DataFrame中以进行进一步处理(例如在Word中进行报告)。
结果应如下所示:
RunNr Value Std
1 126 59,9
1 158 59,9
1 18 59,9
2 65 Nan
3 31 13,5
3 4 13,5
我想出的最好的解决方案是计算标准偏差(和其他统计数据),将其放入字典中,其中运行数字是关键,值是标准偏差。
我现在有一个字典,其中字典中的运行号是唯一键,而不在DataFrame中。我的下一步是遍历字典,然后使用.loc()将相应的值插入正确的行:
for key, value in self.dict_of_std:
self.internal_main_df.loc[self.internal_main_df.Fnr == key] = value
我收到此错误:
TypeError: cannot unpack non-iterable float object
建议改进我的代码,或者对我的总体方法表示赞赏。
答案 0 :(得分:1)
如果需要每组std
填充一列,请使用GroupBy.transform
和一个聚合函数,此处为std
:
df['Std'] = df.groupby('RunNr')['Value'].transform('std')
print (df)
RunNr Value Std
0 1 126 73.357572
1 1 158 73.357572
2 1 18 73.357572
3 2 65 NaN
4 3 31 19.091883
5 3 4 19.091883
如果可能需要更多统计信息,请在新列中使用DataFrameGroupBy.describe
和DataFrame.join
:
df1 = df.join(df.groupby('RunNr')['Value'].describe(), on='RunNr')
print (df1)
RunNr Value count mean std min 25% 50% 75% \
0 1 126 3.0 100.666667 73.357572 18.0 72.00 126.0 142.00
1 1 158 3.0 100.666667 73.357572 18.0 72.00 126.0 142.00
2 1 18 3.0 100.666667 73.357572 18.0 72.00 126.0 142.00
3 2 65 1.0 65.000000 NaN 65.0 65.00 65.0 65.00
4 3 31 2.0 17.500000 19.091883 4.0 10.75 17.5 24.25
5 3 4 2.0 17.500000 19.091883 4.0 10.75 17.5 24.25
max
0 158.0
1 158.0
2 158.0
3 65.0
4 31.0
5 31.0
或者可以在GroupBy.agg
函数中指定集合函数:
df2 = df.join(df.groupby('RunNr')['Value'].agg(['mean','max','std']), on='RunNr')
print (df2)
RunNr Value mean max std
0 1 126 100.666667 158 73.357572
1 1 158 100.666667 158 73.357572
2 1 18 100.666667 158 73.357572
3 2 65 65.000000 65 NaN
4 3 31 17.500000 31 19.091883
5 3 4 17.500000 31 19.091883