Pandas 按平均问题分组
Pandas groupby mean issue
我试图找到每一轮事件的平均值(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
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
。
to_csv
/read_csv
使用指定的适当 NaN
值读取 csv
,然后使用 0
读取 fillna
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
我试图找到每一轮事件的平均值(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
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
。
to_csv
/read_csv
使用指定的适当 NaN
值读取 csv
,然后使用 0
fillna
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