假设我有一个如下所示的数据框:
df = pd.DataFrame({'id': [1,1,1,1,2,2,2,3,4,4,4,4,4],
'feedback': ['one word', np.nan, np.nan, 'test',
'second', np.nan, 'test 2',
np.nan,
'fourth', 'multiple words', 'test 1 2 3', 'things', np.nan]})
print(df)
id feedback
0 1 one word
1 1 NaN
2 1 NaN
3 1 test
4 2 second
5 2 NaN
6 2 test 2
7 3 NaN
8 4 fourth
9 4 multiple words
10 4 test 1 2 3
11 4 things
12 4 NaN
我想计算一些汇总值:
id
id
id
我想要的输出是:
id count complete avg_words
0 1 4 2 1.5
1 2 3 2 1.5
2 3 1 0 NaN
3 4 5 4 2.0
我有以下代码可以完成除最后一点之外的所有代码:
df.groupby(['id']).agg({'id': 'count',
'feedback': ['count', lambda x: len(x)]}).reset_index()
这给了我:
id feedback
count count <lambda>
0 1 4 2 4
1 2 3 2 3
2 3 1 0 1
3 4 5 4 5
除了最后一栏之外,一切都是正确的(索引也有点奇怪,但这只是一个小问题)
lambda函数是一个占位符。如何计算每个id
提供的反馈的平均单词数?
答案 0 :(得分:1)
试试这个:
In [96]: df.assign(avg_words=df['feedback'].str.split().str.len()) \
...: .groupby('id') \
...: .agg({'id': 'count','feedback': 'count', 'avg_words': 'mean'}) \
...: .rename(columns={'id':'count', 'feedback':'complete'}) \
...: .reset_index()
Out[96]:
id count complete avg_words
0 1 4 2 1.5
1 2 3 2 1.5
2 3 1 0 NaN
3 4 5 4 2.0