[英]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.