[英]fastest way to copy values from one cell of a dataframe to another data frame if a third cell matches
[英]Fastest way to merge Dataframe into one data frame
我想尽快将两个 Dataframes 合并为 1 个。
DF1:
A B C
0 A0 B0 C0
1 A1 B1 C1
2 A2 B2 C2
3 A3 B3 C3
4 A4 B4 C4
5 A5 B5 C5
6 A6 B6 C6
7 A7 B7 C7
</pre>
DF2:
A Z 0 A3 Z4 1 A5 Z5 2 A6 Z6 3 A7 Z7
当前结果:
A B C Z 0 A0 B0 C0 NaN 1 A1 B1 C1 NaN 2 A2 B2 C2 NaN 3 A3 B3 C3 [Z4] 4 A4 B4 C4 [Z4] 5 A5 B5 C5 [Z5] 6 A6 B6 C6 [Z6] 7 A7 B7 C7 [Z7]
要求的结果:
A B C Z 0 A0 B0 C0 NaN 1 A1 B1 C1 NaN 2 A2 B2 C2 NaN 3 A3 B3 C3 Z4 4 A4 B4 C4 NaN 5 A5 B5 C5 Z5 6 A6 B6 C6 Z6 7 A7 B7 C7 Z7
我的代码有三个问题。 1) 我不希望 Z4 重复。 如果它为空,我只喜欢 NaN。
2)我不知道为什么,但是当它应该是字符串格式时作为列表出现。
3) 很慢。注意:DF2 数据框 A 列中的所有内容将始终位于 D2 A 列中
我当前的代码
```
import pandas as pd
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7'],
'B': ['B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B7'],
'C': ['C0', 'C1', 'C2', 'C3','C4', 'C5', 'C6', 'C7']},
index=[0, 1, 2, 3, 4, 5, 6, 7])
df2 = pd.DataFrame({'A': ['A3', 'A5', 'A6', 'A7'],
'Z': ['Z4', 'Z5', 'Z6', 'Z7'],
},
index=[0, 1, 2, 3])
def mergeDF(df1, df2):
import pandas as pd
v = df1.merge(df2[['A', 'Z']])\
.groupby(df1.columns.tolist())\
.Z\
.apply(pd.Series.tolist)
df = pd.DataFrame(v.tolist(), index=v.index)\
.rename(columns=lambda x: x + 1)\
.add_prefix('Z')\
.reset_index()
df = df1.merge(v, how='left', on='A').ffill()
print (df)
mergeDF(df1, df2)
print (df1)
```
你可以用比你现在所做的更简单的方式来做到这一点:
pd.merge(df1,df2,how='left',on='A')
您有一个列表,因为您在函数ffill
v 转换为 list 并添加了ffill
,它将用列中的最后一个非空值替换空值
快速一:
>>>df1.join(df2.set_index('A'), how='outer', on='A')`
A B C Z
0 A0 B0 C0 NaN
1 A1 B1 C1 NaN
2 A2 B2 C2 NaN
3 A3 B3 C3 Z4
4 A4 B4 C4 NaN
5 A5 B5 C5 Z5
6 A6 B6 C6 Z6
7 A7 B7 C7 Z7
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.