我有一个包含两列包含列表的数据框。我想将这些列合并为一个列,然后将列表合并为一个列表。另外,此列表应仅包含原始列表中的唯一值。
我尝试使用df['E']=df[['B','C']].values.tolist()
合并它们。
但是,这将创建一个单列,其值包含两个列表。
数据框看起来像这样:
A B C D
a1 [b1,b2] [c1,b1] d1
a2 [b1,b1] [b3] d2
a3 [b2] [b2,b2] d3
最终数据框应如下所示:
A B C D E
a1 [b1,b2] [c1,b1] d1 [b1,b2,c1]
a2 [b1,b1] [b3] d2 [b1,b3]
a3 [b2] [b2,b2] d3 [b2]
编辑:数据框列表中的值是字符串。
答案 0 :(得分:5)
IIUC
df['E']=(df.B+df.C).map(set).map(list)
df
Out[81]:
A B C D E
0 a1 [b1, b2] [c1, b1] d1 [b2, b1, c1]
1 a2 [b1, b1] [b3] d2 [b3, b1]
2 a3 [b2] [b2, b2] d3 [b2]
答案 1 :(得分:3)
您可以在列表理解中将itertools.chain
与dict.fromkeys
一起使用。请注意,如果选择系列中的列表,则会失去所有向量化的好处。
from itertools import chain
df = pd.DataFrame({'A': ['a1', 'a2', 'a3'],
'B': [['b1', 'b2'], ['b1', 'b1'], ['b2']],
'C': [['c1', 'b1'], ['b3'], ['b2', 'b2']],
'D': ['d1', 'd2', 'd3']})
df['E'] = [list(dict.fromkeys(chain(x, y))) for x, y in zip(df['B'], df['C'])]
print(df)
A B C D E
0 a1 [b1, b2] [c1, b1] d1 [b1, b2, c1]
1 a2 [b1, b1] [b3] d2 [b1, b3]
2 a3 [b2] [b2, b2] d3 [b2]
由于字典是按插入顺序排序的,因此保留了该方法在Python v3.7 +(以及非正式地在v3.6中作为CPython实现细节)的好处。
答案 2 :(得分:1)
如果顺序无关紧要,set将完成此工作:
import pandas as pd
data = [['a1', ['b1', 'b2'], ['c1', 'b1'], 'd1'],
['a2', ['b1', 'b1'], ['b3'], 'd2'],
['a3', ['b2'], ['b2', 'b2'], 'd3']]
df = pd.DataFrame(data=data, columns=['A', 'B', 'C', 'D'])
def uniques(xs):
return list(set(xi for x in xs for xi in x))
df['E'] = df[['B', 'C']].apply(uniques, axis=1)
print(df)
输出
A B C D E
0 a1 [b1, b2] [c1, b1] d1 [b1, b2, c1]
1 a2 [b1, b1] [b3] d2 [b1, b3]
2 a3 [b2] [b2, b2] d3 [b2]
如果订单确实重要,请使用OrderedDict:
import pandas as pd
from collections import OrderedDict
data = [['a1', ['b1', 'b2'], ['c1', 'b1'], 'd1'],
['a2', ['b1', 'b1'], ['b3'], 'd2'],
['a3', ['b2'], ['b2', 'b2'], 'd3']]
df = pd.DataFrame(data=data, columns=['A', 'B', 'C', 'D'])
def uniques(xs):
return list(OrderedDict().fromkeys(xi for x in xs for xi in x))
df['E'] = df[['B', 'C']].apply(uniques, axis=1)
输出
A B C D E
0 a1 [b1, b2] [c1, b1] d1 [b1, b2, c1]
1 a2 [b1, b1] [b3] d2 [b1, b3]
2 a3 [b2] [b2, b2] d3 [b2]