簡體   English   中英

Python - 將兩個列表列合並為唯一元素值

[英]Python - Merge two list columns into unique elements values

我試圖合並兩個看起來像列表格式的列。 我試圖通過合並捕獲唯一值。 我試圖在數據框架上運行'set',但還有。

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 combined_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

使用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

由於它們是列表,為什么不擴展它們,也是唯一的那些值,如:

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

你可以使用很多方法:

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))

以下是對提供的數據測試的那些方法的性能:

在此輸入圖像描述

我們可以很容易地看到method1很快。 但它有點作弊,因為它實際上是從字典而不是數據框開始的。 所以我添加了另一個名為method1_mend()方法來包含轉換時間。 但它仍然是最快的。 但由於我只對上面提供的一個非常小的數據幀進行了測試,因此小數據集上的numpy性能很容易因其開銷而蒙上陰影。 對於大數據框架,方法1可能不是最好的方法。

基本上從結果來看,我們可以得出結論,通常numpy操作比Series快,比DataFrame操作更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM