Pandas:将包含列表的列扩展为新的列变量,其中的单元格代表count

时间:2016-11-14 02:35:10

标签: python pandas dataframe

我从具有单独点击数据的数据集开始。我以年度方式汇总数据以构建时间序列。但我遇到的一个问题是聚合点击源(点击来自的例子)。因此,在聚合之后,我有以下数据框。

    year  month  clickSource
0   2010    01  google, yahoo, google, google, facebook, facebook
1   2010    02  facebook, yahoo, google, google, facebook, facebook
2   2010    03  yahoo, yahoo, google, google, facebook, facebook
3   2010    04  google, yahoo, google, twitter, facebook, facebook
4   2010    05  facebook, yahoo, google, google, facebook, facebook
5   2010    06  twitter, yahoo, google, twitter, facebook, google

我想为clickSource列中的每个唯一项目以及计数示例引入列:

    year  month  google  yahoo  facebook  twitter
0   2010    01    3       1         2       0
1   2010    02    2       1         3       0   
2   2010    03    2       2         2       0 
...

最初我的专栏是一个字符串对象,所以我把它转换为fallows列出:

temp['clickSource'] = temp['clickSource'].apply(lambda x: x.split(','))

然后我做了一个系列:

col_names = temp['clickSource'].apply(pd.Series)

但是这为列表中的每个项目创建了一个列,而不是每个项目一次(显然是因为我没有告诉它计算等)。如何获得我解释的内容?

3 个答案:

答案 0 :(得分:3)

创建一个数据框,其中源列分割并分布在多个列中:

rewrite ^/foo/(.*) /AA$1 break;

提取该数据框中元素的计数器,并获取重复的列名:

df = temp.clickSource.str.split(',', expand=True)

将结果沿列轴分组并对结果求和:

df = pd.get_dummies(df, prefix='', prefix_sep='')

合并两个结果数据帧:

df = df.groupby(df.columns, axis=1).sum()
df 
   facebook  google  twitter  yahoo
0         2       3        0      1
1         3       2        0      1
2         2       2        0      2
3         2       2        1      1
4         3       2        0      1
5         1       2        2      1

答案 1 :(得分:3)

df.set_index(['year', 'month']).clickSource.str.split(', ') \
    .apply(pd.value_counts).fillna(0).astype(int).reset_index()

enter image description here

答案 2 :(得分:2)

这是另一种选择:

import pandas as pd
pd.concat([df, 
          df.clickSource.apply(lambda x: pd.Series(x.split(', ')).value_counts()).fillna(0)], 
          axis = 1)

enter image description here