Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:将包含列表的列展开为新的列变量,其中单元格表示计数_Python_Pandas_Dataframe - Fatal编程技术网

Python 熊猫:将包含列表的列展开为新的列变量,其中单元格表示计数

Python 熊猫:将包含列表的列展开为新的列变量,其中单元格表示计数,python,pandas,dataframe,Python,Pandas,Dataframe,我从具有单个单击数据的数据集开始。我以每年一次的方式汇总数据,以构建一个时间序列。但我遇到的一个问题是聚合click的源代码(click来自哪里的示例)。作为聚合后的结果,我有以下数据帧 year month clickSource 0 2010 01 google, yahoo, google, google, facebook, facebook 1 2010 02 facebook, yahoo, google, google, facebook, fa

我从具有单个单击数据的数据集开始。我以每年一次的方式汇总数据,以构建一个时间序列。但我遇到的一个问题是聚合click的源代码(click来自哪里的示例)。作为聚合后的结果,我有以下数据帧

    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 
...
最初,我的列是一个字符串对象,因此我将其转换为列为休止符:

temp['clickSource'] = temp['clickSource'].apply(lambda x: x.split(','))
然后我做了一个系列:

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

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

创建一个数据帧,将源列拆分并分布在多个列中:

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
合并两个结果数据帧:

pd.concat([temp, df], axis=1)
Out[48]: 
   year  month  facebook  google  twitter  yahoo
0  2010      1         2       3        0      1
1  2010      2         3       2        0      1
2  2010      3         2       2        0      2
3  2010      4         2       2        1      1
4  2010      5         3       2        0      1
5  2010      6         1       2        2      1

这是另一个选择:

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


apply(pd.value\u计数)
神奇地将各种索引合并到列索引中。您是否在apply或相关文件中有任何东西可以证明这一点,或者这纯粹是(过去或现在的)试验和成功?我不想用这种方式尝试,因为我不想在这里用这种神奇的方式。有什么见解吗welcome@boud,通过试用,我知道
pd.value\u counts
获取一个列表并返回一个在索引中具有唯一值的序列,并将其计为值。在一个系列中应用一个返回一个系列的函数正是这个神奇之处。更进一步地说,我非常确定(尽管我没有去看)pd.value\u counts使用
np.unique(x,return\u counts=True)
返回一个由唯一值和值计数组成的元组。@Boud有一个成功的答案。由于某种原因,这不起作用。它扩展了专栏,当我查看最终结果时,它有多个google、facebook专栏。@很高兴知道。我绕回来试着把它修好。看来你已经有了获胜的答案。由于某种原因,其他两种方法没有聚合。相反,它们都在没有聚合的情况下扩展了列。不知道为什么。这是一个非常优雅的答案,但正如我在其他答案中提到的,最终数据框有多个
google、facebook
,而不是一个代表所有google等。我知道在你的答案中它真的有效,但不确定它不起作用的是什么@布德的回答奏效了。
df.set_index(['year', 'month']).clickSource.str.split(', ') \
    .apply(pd.value_counts).fillna(0).astype(int).reset_index()