在pandas
中,如何合并两个数据集,以使列中包含的数组连接在一起?
例如,让d1
和d2
两个数据集合并。就我而言,我有大约100个相对较小的数据框要合并:
>> d1
id seq
0 AAA (1, 2, 3, 4)
1 BBB (1, 2, 3, 4) <---
>> d2
id seq
0 CCC (1, 2, 3, 4)
1 DDD (1, 2, 3, 4)
2 BBB (5, 6, 7) <---
现在我们要:
>> df
id seq
AAA (1, 2, 3, 4)
BBB (1, 2, 3, 4, 5, 6, 7) <---
DDD (1, 2, 3, 4)
CCC (1, 2, 3, 4)
如何有效地做到这一点?
我尝试了合并,但似乎不得不通过我想避免的方法apply
。
答案 0 :(得分:2)
不要在DataFrame中使用元组/列表/字典,因为在熊猫函数中失去了跟踪功能。
seq
列中为元组的解决方案:
dfs = [df1, df2]
df = pd.concat(dfs).groupby('ip')['seq']
.apply(lambda x: tuple([z for y in x for z in y]))
.reset_index()
print (df)
ip seq
0 110.11.1.5 (1, 2, 3, 4, 5, 6, 7)
1 115.65.20.1 (1, 2, 3, 4)
2 118.11.1.5 (1, 2, 3, 4)
3 55.65.85.1 (1, 2, 3, 4)
扁平化的性能要好一些
dfs = [df1, df2] * 50
In [57]: %timeit pd.concat(dfs).groupby('ip',as_index=False).seq.sum()
15.7 ms ± 452 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [58]: %timeit pd.concat(dfs).groupby('ip')['seq'].apply(lambda x: tuple([z for y in x for z in y])).reset_index()
7.86 ms ± 72.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
答案 1 :(得分:1)
IIUC
pd.concat([df1,df2]).groupby('id',as_index=False).seq.sum()
Out[860]:
id seq
0 A (1, 2, 3, 4)
1 B (1, 2, 3, 4, 5, 6, 7)
2 C (1, 2, 3, 4)
3 D (1, 2, 3, 4)