Python 按平均值发行

Python 按平均值发行,python,pandas,group-by,nan,Python,Pandas,Group By,Nan,我试图找出每一轮(R1、R2、R3、R4)的平均事件数。 不幸的是,未播放的回合以3种不同的方式表示(0,-或空单元格) 我尝试用NaN替换0和-,但仍然得到不同的结果 df['R3']=df['R3'].替换(['0','-',np.nan) df['R4']=df['R4'].替换(['0','-',np.nan) 结果 df.groupby('event')['R1','R2', 'R3', 'R4'].mean() R1 R2 R4 event Atlant

我试图找出每一轮(R1、R2、R3、R4)的平均事件数。 不幸的是,未播放的回合以3种不同的方式表示(0,-或空单元格)

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

df['R3']=df['R3'].替换(['0','-',np.nan) df['R4']=df['R4'].替换(['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

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
,只需将
np.where()
中的
0
替换为
np.NaN
到_csv
/
读取_csv
使用指定的相应
NaN
值读取
csv
,然后使用
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.到数值

您的'R3'数据类型是对象,您需要将其转换为数字数据类型,然后重试该语句。
df[df.columns[2:].replace('-',0.astype('float').groupby(df['event']).mean()
感谢您指出需要使用float-我已经尝试过('int'),但这不起作用。出于我自己的好奇心,你知道为什么在所有的值都没有小数点的情况下需要浮点吗?
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
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