Pandas计算groupby中的平均单词数

时间:2017-11-16 10:50:33

标签: python pandas aggregate pandas-groupby

假设我有一个如下所示的数据框:

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提供的反馈的平均单词数?

1 个答案:

答案 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