Pandas groupby 并计算多列中值与 NA 的比率
Pandas groupby and compute ratio of values with NA in multiple columns
我有一个如下所示的数据框
id,status,amount,qty
1,pass,123,4500
1,pass,156,3210
1,fail,687,2137
1,fail,456,1236
2,pass,216,324
2,pass,678,241
2,nan,637,213
2,pass,213,543
df = pd.read_clipboard(sep=',')
我想做以下事情
a) Groupby id
并计算每个 id
的通过百分比
b) Groupby id
并计算每个 id
的平均值 amount
所以,我尝试了以下方法
df['amt_avg'] = df.groupby('id')['amount'].mean()
df['pass_pct'] = df.groupby('status').apply(lambda x: x['status']/ x['status'].count())
df['fail_pct'] = df.groupby('status').apply(lambda x: x['status']/ x['status'].count())
但这行不通。
我无法获得通过率。
在我的真实数据中,我有很多像 status
这样的列,我必须为此找到特定值的这些百分比分布(例如:通过)
我希望我的输出如下所示
id,pass_pct,fail_pct,amt_avg
1,50,50,2770.75
2,75,0,330.25
使用crosstab
with replace missing values by nan
with remove nan
column and then add new column amt_avg
by DataFrame.join
:
s = df.groupby('id')['qty'].mean()
df = (pd.crosstab(df['id'], df['status'].fillna('nan'), normalize=0)
.drop('nan', 1)
.mul(100)
.join(s.rename('amt_avg')))
print (df)
fail pass amt_avg
id
1 50.0 50.0 2770.75
2 0.0 75.0 330.25
我有一个如下所示的数据框
id,status,amount,qty
1,pass,123,4500
1,pass,156,3210
1,fail,687,2137
1,fail,456,1236
2,pass,216,324
2,pass,678,241
2,nan,637,213
2,pass,213,543
df = pd.read_clipboard(sep=',')
我想做以下事情
a) Groupby id
并计算每个 id
b) Groupby id
并计算每个 id
amount
所以,我尝试了以下方法
df['amt_avg'] = df.groupby('id')['amount'].mean()
df['pass_pct'] = df.groupby('status').apply(lambda x: x['status']/ x['status'].count())
df['fail_pct'] = df.groupby('status').apply(lambda x: x['status']/ x['status'].count())
但这行不通。
我无法获得通过率。
在我的真实数据中,我有很多像 status
这样的列,我必须为此找到特定值的这些百分比分布(例如:通过)
我希望我的输出如下所示
id,pass_pct,fail_pct,amt_avg
1,50,50,2770.75
2,75,0,330.25
使用crosstab
with replace missing values by nan
with remove nan
column and then add new column amt_avg
by DataFrame.join
:
s = df.groupby('id')['qty'].mean()
df = (pd.crosstab(df['id'], df['status'].fillna('nan'), normalize=0)
.drop('nan', 1)
.mul(100)
.join(s.rename('amt_avg')))
print (df)
fail pass amt_avg
id
1 50.0 50.0 2770.75
2 0.0 75.0 330.25