如何输出分组对象中指定列中所有值的列表

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 中包含的所有数据的“汇总”。

我现在的问题是当我printAll_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

以上是关于如何输出分组对象中指定列中所有值的列表的主要内容,如果未能解决你的问题,请参考以下文章

使用 XSLT 在 3 列中输出分组列表

Python Pandas:如何将列中的分组列表作为字典返回

如何在 python 中创建一个函数,它将整数列表作为输入并输出只有两个值的较小列表?

如何从 MySQL 表中选择消息列表?

根据 r 中的其他列对一个列表中的一列的所有值进行分组

如何在pe:gcharts中指定列类型