Python 熊猫:将包含列表的列展开为新的列变量,其中单元格表示计数
我从具有单个单击数据的数据集开始。我以每年一次的方式汇总数据,以构建一个时间序列。但我遇到的一个问题是聚合click的源代码(click来自哪里的示例)。作为聚合后的结果,我有以下数据帧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
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()