我有以下数据框:

df= pd.DataFrame({'A': np.random.randn(10),
                  'B': np.concatenate((np.repeat(np.nan, 4), np.array([0.7]), np.repeat(np.nan, 4), np.array([0.5]))),
                  'C': np.random.randn(10),
                  'D': np.concatenate((np.repeat(np.nan, 4), np.array([0.2]), np.repeat(np.nan, 4), np.array([0.15])))})


看起来像这样:

    A           B    C           D
0   0.537109    NaN  -0.204046   NaN
1   0.744488    NaN   0.903607   NaN
2   0.640995    NaN   0.712210   NaN
3   0.212758    NaN   0.293984   NaN
4  -1.786725    0.7   0.282747   0.20
5   1.486037    NaN  -0.199659   NaN
6   0.267356    NaN   0.890397   NaN
7   0.697408    NaN  -0.771626   NaN
8   0.044247    NaN  -1.157836   NaN
9   0.345658    0.5   1.556390   0.15


我想计算一些统计数据,例如此数据帧切片的均值,例如,我希望结果看起来像这样:

    MeanA   B    MeanC  D
0   2.1     0.7  1.3    0.20
1   1.4     0.5  5.6    0.15


换句话说,我想保留B和D列的非NA值,并计算B和D的非NA值之上/之下的值的平均值和A和C的其他值(在这种情况下,让我们包括两种方式均为-1.786725,相似地为0.282747)。

注意:由于使用了np.random.randn(),因此构成了MeanA和MeanC中的值。

当然,现在,我的真实数据框包含更多的列和更多的行,因此将其概括起来将是一件很不错的事情。

最佳答案

应该这样做:

b_nans = df[~df.B.isnull()].index.values
cols_stats = ['A','C']
cols_nans = ['B','D']
df2 = pd.DataFrame(columns = [['mean_'+ col for col in cols] + cols_nans])

for col_stat, col_nan in zip(cols_stats, cols_nans):
    df2[col_nan] = df[~df[col_nan].isnull()][col_nan].reset_index(drop=True)
    i_prev = 0
    for k,i in enumerate(b_nans):
        df2.loc[k, 'mean_'+ col_stat] = df.loc[i_prev:i,col_stat].mean()
        i_prev = i

print(df2)

      mean_A    mean_C       B    D
0   -0.059588   0.367446    0.7 0.20
1   0.037202    0.373243    0.5 0.15

10-04 21:52
查看更多