我正在尝试合并看起来像列表格式的两列。我试图通过合并捕获独特的价值。我试图在数据框上运行“设置”,但是还没有。
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
答案 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))
以下是对提供的数据进行测试的那些方法的性能:
我们可以很容易地看到method1
正在迅速发展。但是它有点作弊,因为它实际上是从字典而不是数据帧开始的。因此,我添加了另一个名为method1_mend()
的方法来包含转换时间。但这仍然是最快的。但是,由于我仅在上面提供的很小的数据帧上进行了测试,因此小数据集上的numpy性能很容易被其开销所掩盖。对于大数据帧,方法1可能不是最佳方法。
基本上可以从结果得出结论,通常numpy操作比Series更快,而Series比DataFrame操作快。