如何按pandas数据框中的单词对统计数据进行分组

时间:2016-08-30 19:56:24

标签: pandas dataframe

我想逐个对熊猫数据进行聚合。

基本上,有3列具有相应短语的点击/展示次数。我想将这个短语分成令牌,然后将他们的点击总结为令牌来决定哪个令牌相对好/坏。

预期输入:熊猫数据框如下

   click_count  impression_count    text
1   10          100                 pizza
2   20          200                 pizza italian
3   1           1                   italian cheese

预期产出:

   click_count  impression_count  token
1   30         300                pizza      // 30 = 20 + 10, 300 = 200+100        
2   21         201                italian    // 21 = 20 + 1
3   1           1                 cheese     // cheese only appeared once in italian cheese

3 个答案:

答案 0 :(得分:1)

tokens = df.text.str.split(expand=True)
token_cols = ['token_{}'.format(i) for i in range(tokens.shape[1])]
tokens.columns = token_cols

df1 = pd.concat([df.drop('text', axis=1), tokens], axis=1)
df1

enter image description here

df2 = pd.lreshape(df1, {'tokens': token_cols})
df2

enter image description here

df2.groupby('tokens').sum()

enter image description here

答案 1 :(得分:1)

这会创建一个像piRSquared一样的新DataFrame,但令牌会堆叠并与原始内容合并:

(df['text'].str.split(expand=True).stack().reset_index(level=1, drop=True)
           .to_frame('token').merge(df, left_index=True, right_index=True)
           .groupby('token')['click_count', 'impression_count'].sum())
Out: 
         click_count  impression_count
token                                 
cheese             1                 1
italian           21               201
pizza             30               300

如果你打破这个,它会合并:

df['text'].str.split(expand=True).stack().reset_index(level=1, drop=True).to_frame('token')
Out: 
     token
1    pizza
2    pizza
2  italian
3  italian
3   cheese

在其索引上使用原始DataFrame。得到的df是:

(df['text'].str.split(expand=True).stack().reset_index(level=1, drop=True)
           .to_frame('token').merge(df, left_index=True, right_index=True))
Out: 
     token  click_count  impression_count            text
1    pizza           10               100           pizza
2    pizza           20               200   pizza italian
2  italian           20               200   pizza italian
3  italian            1                 1  italian cheese
3   cheese            1                 1  italian cheese

其余的是通过令牌列进行分组。

答案 2 :(得分:0)

你可以做到

In [3091]: s = df.text.str.split(expand=True).stack().reset_index(drop=True, level=-1)

In [3092]: df.loc[s.index].assign(token=s).groupby('token',sort=False,as_index=False).sum()
Out[3092]:
     token  click_count  impression_count
0    pizza           30               300
1  italian           21               201
2   cheese            1                 1

详细

In [3093]: df
Out[3093]:
   click_count  impression_count            text
1           10               100           pizza
2           20               200   pizza italian
3            1                 1  italian cheese

In [3094]: s
Out[3094]:
1      pizza
2      pizza
2    italian
3    italian
3     cheese
dtype: object