Python-将两个列表列合并为唯一元素值

时间:2018-12-04 02:24:42

标签: python python-3.x

我正在尝试合并看起来像列表格式的两列。我试图通过合并捕获独特的价值。我试图在数据框上运行“设置”,但是还没有。

d = {'list1_col1': [[],[],['apples','apples','bananas','oranges'],['kiwi'],[],['green apples']], 
     'list2_col2': [[],['apples','bananas','oranges','oranges','oranges'],[],['mango'],[],[]]}
df = pd.DataFrame(data=d)
df

df['combined_list_col'] = df.list1_col1.astype(str).str.cat(df.list2_col2.astype(str), sep='')
df['combined_list_col'] 

print(df['combined_list_col'].tolist()) # not exactly
print('')
print(''.join([j for i in df['combined_list_col'] for j in i])) # not exactly

当前,我得到:

0                                                 [][]
1    []['apples', 'bananas', 'oranges', 'oranges', ...
2         ['apples', 'apples', 'bananas', 'oranges'][]
3                                    ['kiwi']['mango']
4                                                 [][]
5                                   ['green apples'][]

寻找这样的输出:

row_id mixed_list_col

1       []
2       [apples, bananas, oranges]
3       [apples,bananas, oranges]
4       ['kiwi','mango']
5       []
6       ['green apples']

这是我尝试过的:

print(df['combined_list_col'].tolist()) # not exactly
print('')
print(''.join([j for i in df['combined_list_col'] for j in i])) # not exactly

3 个答案:

答案 0 :(得分:1)

使用itertools.chain

的一种方法
from itertools import chain
pd.Series([list(set(chain.from_iterable(t))) for t in zip(*d.values())])

输出:

0                            []
1    [apples, oranges, bananas]
2    [apples, oranges, bananas]
3                 [mango, kiwi]
4                            []
5                [green apples]
dtype: object

答案 1 :(得分:1)

由于它们是列表,为什么不扩展它们,还要使这些值唯一,例如:

print((df['list1_col1']+df['list2_col2']).apply(lambda x: pd.Series(x).unique()))

输出:

0                            []
1    [apples, bananas, oranges]
2    [apples, bananas, oranges]
3                 [kiwi, mango]
4                            []
5                [green apples]
dtype: object

答案 2 :(得分:1)

您可以使用很多方法:

def method1():
    return pd.Series([list(set(chain.from_iterable(t))) for t in zip(*d.values())])

def method1_mend():
    dd = df.to_dict('list')
    return pd.Series([list(set(chain.from_iterable(t))) for t in zip(*dd.values())])

def method2():
    return (df['list1_col1']+df['list2_col2']).apply(lambda x: pd.Series(x).unique())

def method3():
    return df.apply(lambda row: np.unique(row.list1_col1 + row.list2_col2), axis=1)

def method4():
    return df.apply(lambda row: pd.Series(row.list1_col1 + row.list2_col2).unique(), axis=1)

def method5():
    return (df['list1_col1']+df['list2_col2']).apply(lambda x: np.unique(x))

以下是对提供的数据进行测试的那些方法的性能:

enter image description here

我们可以很容易地看到method1正在迅速发展。但是它有点作弊,因为它实际上是从字典而不是数据帧开始的。因此,我添加了另一个名为method1_mend()的方法来包含转换时间。但这仍然是最快的。但是,由于我仅在上面提供的很小的数据帧上进行了测试,因此小数据集上的numpy性能很容易被其开销所掩盖。对于大数据帧,方法1可能不是最佳方法。

基本上可以从结果得出结论,通常numpy操作比Series更快,而Series比DataFrame操作快。