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
的解决方案,对于set
NaN
的列表,使用
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