熊猫groupby均值问题

时间:2020-04-27 19:21:10

标签: python pandas group-by nan

我正在尝试查找每个回合(R1,R2,R3,R4)的事件均值。 不幸的是,未玩的回合以3种不同的方式表示(0,-或空单元格)。

    event   plyr    R1  R2  R3  R4
0   Houston Dave    67  90.0    70  72
1   Houston Bobx    69  69.0    69  69
2   Houston Carlx   69  71.0    71  71
3   Miamixx Cliff   67  70.0    70  70
4   Miamixx Dean    70  71.0    71  71
5   Miamixx Clive   69  69.0    -   0
6   Miamixx Patxx   71  70.0    -   0
7   Atlanta Phil    67  70.0    70  72
8   Atlanta Dave    69  NaN 71  73
9   Atlanta Bobx    69  NaN -   0

我尝试用NaN替换0和-,但仍然得到不同的结果

df ['R3'] = df ['R3']。replace(['0','-'],np.nan) df ['R4'] = df ['R4']。replace(['0','-'],np.nan)

结果

df.groupby('event')['R1','R2', 'R3', 'R4'].mean()


R1  R2  R4
event           
Atlanta 68.333333   70.000000   48.333333
Houston 68.333333   76.666667   70.666667
Miamixx 69.250000   70.000000   35.250000

2 个答案:

答案 0 :(得分:1)

groupby的平均聚合将排除NaN的值,但包括零。因此,您需要根据需要的结果替换为0或保留NaN

这会将所有-NaN的值设置为0

cols = ['R1', 'R2', 'R3', 'R4']

for col in cols:
    df[col] = np.where((df[col]=='-') | (df[col].isnull()==True), 0, df[col])
    df[col] = pd.to_numeric(df[col])

df.groupby('event').mean()

如果要用NaN代替0,只需用0替换np.where()中的np.NaN

答案 1 :(得分:0)

to_csv / read_csv

使用指定的适当csv值读取NaN,然后使用fillna读取0

from io import StringIO as io_
df = pd.read_csv(io_(df.to_csv(index=False)), na_values=['-']).fillna(0)

df.groupby('event')[['R1', 'R2', 'R3', 'R4']].mean()

                R1         R2     R3         R4
event                                          
Atlanta  68.333333  23.333333  47.00  48.333333
Houston  68.333333  76.666667  70.00  70.666667
Miamixx  69.250000  70.000000  35.25  35.250000

pd.to_numeric

df.filter(like='R').apply(pd.to_numeric, errors='coerce') \
  .fillna(0).groupby(df.event).mean()

                R1         R2     R3         R4
event                                          
Atlanta  68.333333  23.333333  47.00  48.333333
Houston  68.333333  76.666667  70.00  70.666667
Miamixx  69.250000  70.000000  35.25  35.250000