如何输出分组对象中指定列中所有值的列表
Posted
技术标签:
【中文标题】如何输出分组对象中指定列中所有值的列表【英文标题】:How to output a list of all values in a specified column in a grouped object 【发布时间】:2016-01-17 15:05:24 【问题描述】:我有以下问题:我有一个分组对象。对于每个分组的对象,我想为该组的特定列中包含的所有值创建一个逗号分隔的列表。我的代码如下:
for key, group in df.groupby('Column1'):
All_values_in_group = []
for item, frame in group['Column2'].iteritems():
list = frame.split(',')
for value in list:
All_values_in_group.append(value)
print key
print All_values_in_group
这背后的想法是我按特定列对数据进行分组,并制作一个空列表。然后,对于每个frame
(行),我通过拆分包含在','
行中的string
来创建一个列表。然后将此列表中的每个值附加到我想要的 output_list All_values_in_group
。该列表应是 X 组每一行的 Column2 中包含的所有数据的“汇总”。
我现在的问题是当我print
All_values_in_group
时我没有得到一个列表,而是几个列表,像这样(L1是组键):
L1
['string1]
L1
['string1, 'string2']
L1
['string1', 'string2', 'string3']
我只想要一个 All_values_in_group 列表,其中包含该组中 Column2 中的所有值,就像示例中的最后一行一样,我想保留重复项。
为了更清楚,这里是我的数据示例:
Column1 Column2
0 L1 string1,string2,string3
1 L1 string1
2 L1 string2,string3
3 L2 stringA,stringB
我想要的是:
L1
All_values_in_group ['string1', 'string2', 'string3', 'string1', 'string2', 'string3']
L2
All_values_in_group ['stringA', 'stringB']
有人知道如何让我的代码像这样工作吗?我觉得这只是一件小事,但我不接受它。提前致谢!
【问题讨论】:
【参考方案1】:您可以在 'Column1' 和 apply
上进行分组,该 lambda 调用 join
来连接所有字符串值,然后如果您希望从该结果构造一个列表对象:
In [22]:
df.groupby('Column1')['Column2'].apply(lambda x: [','.join(x)])
Out[22]:
Column1
L1 [string1,string2,string3,string1,string2,string3]
L2 [stringA,stringB]
Name: Column2, dtype: object
【讨论】:
等等,实际上它并不完美。列表的最后一个和第一个字符串不是逗号分隔的,而是作为一个字符串连接在一起...我该如何更正? 嘿,如果你不介意的话,我有一个关于输出的问题。我不确定如何以这种形式的输出继续我的工作。例如,我如何计算数据中每个组的每个值的出现次数?我尝试在结果对象上调用count_values()
,但总是得到错误AttributeError: 'list' object has no attribute 'count_values'
。
由于许多原因,在 df 中存储列表并不是很好地使用数据帧,您必须自己执行计数,将每一行转换为熊猫系列,然后您可以使用value_counts
或者如果我将 lambda x 函数写成函数,它会是什么样子?我刚试过def listi(x): lambda x: (',').join(x)
,但应用它会导致输出为空..
你可以这样做:In [83]: df1 = df.groupby('Column1')['Column2'].apply(lambda x: [','.join(x)]) df1 = df1.reset_index() def func(x): print(pd.Series(x[0][0].split(',')).value_counts()) df1[['Column2']].apply(lambda x: func(x), axis=1) string1 2 string3 2 string2 2 dtype: int64 stringB 1 stringA 1 dtype: int64
以上是关于如何输出分组对象中指定列中所有值的列表的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas:如何将列中的分组列表作为字典返回