用pandas数据框中的平均值替换大小> 1的组

时间:2018-12-03 19:08:56

标签: python python-3.x pandas pandas-groupby

因此,我想对某些列进行分组,对于大小大于1的每个组,取其余列的均值(如果所有值均为nan,则应为nan;否则,我希望将nans落在均值中计算,这是默认行为)。然后我要删除多余的行。下面的代码可以做到这一点:

import pandas as pd
import numpy as np

df = pd.DataFrame(
    [[1, np.nan, 100, 63], [2, np.nan, 101, 63], [2, 12, 102, 63],
     [2, 14, 102, 63], [2, 14, 102, 64], [1, np.nan, 200, 63]],
    columns=['group', 'value', 'value2', 'dummy'])
print(df)
df = df.set_index(['group', 'dummy'])
groupby = df.groupby(['group', 'dummy'])
idx = groupby.size() > 1
df_groups_to_process = df.loc[idx]
# the code below would calculate the mean for all groups, huge performance hit
# df.loc[idx, ['value', 'value2']] = \
#     groupby[['value', 'value2']].transform('mean')[idx].values
df.loc[idx, ['value', 'value2']] = \
    df_groups_to_process.groupby(['group', 'dummy'])[
        ['value', 'value2']].transform('mean').values
print(df)
df = df.groupby(['group', 'dummy']).first()
print(df)

打印:

   group  value  value2  dummy
0      1    NaN     100     63
1      2    NaN     101     63
2      2   12.0     102     63
3      2   14.0     102     63
4      2   14.0     102     64
5      1    NaN     200     63
sys:1: PerformanceWarning: indexing past lexsort depth may impact performance.
             value      value2
group dummy                   
1     63       NaN  150.000000
2     63      13.0  101.666667
      63      13.0  101.666667
      63      13.0  101.666667
      64      14.0  102.000000
1     63       NaN  150.000000
             value      value2
group dummy                   
1     63       NaN  150.000000
2     63      13.0  101.666667
      64      14.0  102.000000

Process finished with exit code 0

但是,有一些可以改进的地方:

  • df_groups_to_process = df.loc[idx]不确定是否会创建一个副本,但是由于我的真实数据非常庞大,我希望完全避免这种情况,并将其合并到df.loc[idx, ['value', 'value2']] = ...行中
  • 我会在最后一次重复groupby操作以首先调用-如何避免这种情况?
  • 奖金:sys:1: PerformanceWarning: indexing past lexsort depth may impact performance.-不知道这是什么意思(我实际上在服务器上看不到)。我该如何纠正?

1 个答案:

答案 0 :(得分:1)

一个值的平均值就是值本身,因此,除非我缺少某些内容,否则无需按组大小进行区分。

考虑

>>> df
   group  value  value2  dummy
0      1    NaN     100     63
1      2    NaN     101     63
2      2   12.0     102     63
3      2   14.0     102     63
4      2   14.0     102     64
5      1    NaN     200     63
>>> 
>>> df.groupby(['group', 'dummy']).mean()
             value      value2
group dummy                   
1     63       NaN  150.000000
2     63      13.0  101.666667
      64      14.0  102.000000

这看起来像您的预期输出。如果这样可以解决您可能正在考虑的所有输入数据框的问题,请发表评论。