Python 在没有当前行值的情况下,如何对数据帧进行分组并计算统计汇总(平均值和标准偏差)?
我有一个数据框Python 在没有当前行值的情况下,如何对数据帧进行分组并计算统计汇总(平均值和标准偏差)?,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个数据框df,有两列foo,bar: foo = [1,2,1,3,1,2,2] bar = [10,11,9,10,11,15,13] pd.DataFrame() df = pd.DataFrame(list(zip(foo,bar)), columns =['foo', 'bar']) 输入df: foo bar 1 10 2 11 1 9 3 10 1 11 2 15 2 13 我需要获得分组(按foo)数据的bar的平均值和标准偏差,但棘手的是我不
df
,有两列foo,bar
:
foo = [1,2,1,3,1,2,2]
bar = [10,11,9,10,11,15,13]
pd.DataFrame()
df = pd.DataFrame(list(zip(foo,bar)), columns =['foo', 'bar'])
输入df:
foo bar
1 10
2 11
1 9
3 10
1 11
2 15
2 13
我需要获得分组(按foo
)数据的bar
的平均值和标准偏差,但棘手的是我不想将当前行值包括在计算中
所需的输出如下所示:
foo bar group_val_except_current_row group_mean_expect_current_row group_sd_except_curr_row
1 10 [9, 11] 10 1.41
2 11 [15, 13] 14 1.41
1 9 [10, 11] 10.5 0.71
3 10 [] Null Null
1 11 [10, 10] 11 0
2 15 [11, 13] 12 1.41
2 13 [11, 15] 13 2.82
我尝试按照下面的代码获取group\u val\u(当前行除外)
列,但使用set
可以消除重复
dfa = df.groupby('foo').agg(lambda x: x.tolist()).reset_index()
dfa['group_values_list'] = dfa['bar']
del dfa['bar']
dfnew = df.merge(dfa)
dfnew['group_values_list'] = dfnew['group_values_list'].apply(set)
dfnew['bar'] = dfnew['bar'].apply(lambda x: [x]).apply(set)
dfnew['group_val_except_current_row'] = dfa['group_val'] - dfnew['bar']
我被困在这里了
``可以使用set解决方案,如果可以100%确定每个组在
栏列中不重复,请使用set
s类似于您使用np.mean
和np.std
的解决方案,对于setNaN
的列表,使用if else
,对于空列表(避免警告
):
另一种解决方案(如果可能重复)是按索引排除列表中行中的当前值-用于当前索引以在列表理解中排除并删除它:
s = df['foo'].map(df.groupby('foo')['bar'].apply(lambda x: list(x)))
counter = df.groupby('foo').cumcount()
df['group_val_except_current_row'] = [[j for i, j in enumerate(x) if i != c]
for x, c in zip(s, counter)]
df['group_mean_expect_current_row'] = df['group_val_except_current_row'].apply(lambda x: np.mean(x) if len(x) > 0 else np.nan)
df['group_sd_except_curr_row'] = df['group_val_except_current_row'].apply(lambda x: np.std(x, ddof=1) if len(x) > 0 else np.nan)
print (df)
foo bar group_val_except_current_row group_mean_expect_current_row \
0 1 10 [9, 11] 10.0
1 2 11 [15, 13] 14.0
2 1 9 [10, 11] 10.5
3 3 10 [] NaN
4 1 11 [10, 9] 9.5
5 2 15 [11, 13] 12.0
6 2 13 [11, 15] 13.0
group_sd_except_curr_row
0 1.414214
1 1.414214
2 0.707107
3 NaN
4 0.707107
5 1.414214
6 2.828427
s = df['foo'].map(df.groupby('foo')['bar'].apply(lambda x: list(x)))
counter = df.groupby('foo').cumcount()
df['group_val_except_current_row'] = [[j for i, j in enumerate(x) if i != c]
for x, c in zip(s, counter)]
df['group_mean_expect_current_row'] = df['group_val_except_current_row'].apply(lambda x: np.mean(x) if len(x) > 0 else np.nan)
df['group_sd_except_curr_row'] = df['group_val_except_current_row'].apply(lambda x: np.std(x, ddof=1) if len(x) > 0 else np.nan)
print (df)
foo bar group_val_except_current_row group_mean_expect_current_row \
0 1 10 [9, 11] 10.0
1 2 11 [15, 13] 14.0
2 1 9 [10, 11] 10.5
3 3 10 [] NaN
4 1 11 [10, 9] 9.5
5 2 15 [11, 13] 12.0
6 2 13 [11, 15] 13.0
group_sd_except_curr_row
0 1.414214
1 1.414214
2 0.707107
3 NaN
4 0.707107
5 1.414214
6 2.828427