如何将包含列表值的pandas列连接成一个列表?

18

我有一个数据框,其中每个索引处的一个列都有一个列表。我想将这些列表连接成一个列表。我正在使用

ids = df.loc[0:index, 'User IDs'].values.tolist()

然而,这导致了['[1,2,3,4......]'],这是一个字符串。不知何故我的列表列中的每个值都是str类型。我已尝试使用list()literal_eval()进行转换,但都没有起作用。list()会将列表中的每个元素转换为字符串,例如从[12,13,14...]['['1'',','2',','1',',','3'......]']

如何将带有列表值的Pandas列连接成一个列表?请给予帮助,我已经在上面纠结了数小时。

2个回答

35

考虑数据框 df

df = pd.DataFrame(dict(col1=[[1, 2, 3]] * 2))
print(df)

        col1
0  [1, 2, 3]
1  [1, 2, 3]

pandas 最简单的答案

df.col1.sum()

[1, 2, 3, 1, 2, 3]

numpy.concatenate

np.concatenate(df.col1)

array([1, 2, 3, 1, 2, 3])

from itertools import chain

list(chain(*df.col1))

[1, 2, 3, 1, 2, 3]
回复评论:
我认为您的列是字符串。
from ast import literal_eval

df.col1 = df.col1.apply(literal_eval)

如果您的列是看起来像列表的字符串值

df = pd.DataFrame(dict(col1=['[1, 2, 3]'] * 2))
print(df)  # will look the same

        col1
0  [1, 2, 3]
1  [1, 2, 3]

然而pd.Series.sum的工作方式不同。

df.col1.sum()

'[1, 2, 3][1, 2, 3]'

我们需要将字符串视为文字,然后进行sum计算。

df.col1.apply(literal_eval).sum()

[1, 2, 3, 1, 2, 3]

谢谢。第一种方法最简单,但如果我想连接几个第一个列表而不是列中的所有列表,该怎么办?我已经尝试过np.concatenate(),但我得到的结果与['[1,2,3...]']相同。 - SarwatFatimaM
@SarwatFatimaM 你可以做很多事情。尝试使用 df.col1.iloc[:3].sum() 来仅组合前3个。 - piRSquared
是的,我已经尝试过这个:ids = pd.DataFrame(GCM.loc[0:2, 'User IDs']) ids = uninstall_ids['User IDs'].sum() 但问题是它的类型是str,这在程序中会进一步创建问题。如果我使用list()或tolist(),那么它会将[12,13,14,15]转换成类似于['['1',',','2',',','1',',','3'...]']的东西。我需要它作为一个列表,因为我将在程序后面使用collections中的counter()来比较两个列表。我也尝试过df.col1.iloc[:3].sum(),但问题相同。 - SarwatFatimaM
我不确定我的pandas列是如何转换为str类型的,因为我没有自己这样做。虽然我正在从Excel表中加载数据。 - SarwatFatimaM
谢谢。我期待着它。 - SarwatFatimaM
显示剩余2条评论

2
如果您想将列表扁平化,这是一种Pythonic的方法:

import pandas as pd

df = pd.DataFrame({'A': [[1,2,3], [4,5,6]]})

a = df['A'].tolist()
a = [i for j in a for i in j]
print a

但这会导致类似于这样的结果 ['[', '1', '2', ',', ' ', '4', '2', ',', ' ', '4', '9', '2', ',', ' ', '1'.........]']。 - SarwatFatimaM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接