zab*_*bop 5 python merge dataframe pandas
import pandas as pd
Run Code Online (Sandbox Code Playgroud)
我有两个数据框:
df=\
pd.DataFrame.from_dict({'A':['xy','yx','zy','zz'],
'B':[[1, 3],[4, 3, 5],[3],[2, 6]]})
df2=\
pd.DataFrame.from_dict({'B':[1,3,4,5,6],
'C':['pq','rs','pr','qs','sp']})
Run Code Online (Sandbox Code Playgroud)
df 好像:
A B
0 xy [1, 3]
1 yx [4, 3, 5]
2 zy [3]
3 zz [2, 6]
Run Code Online (Sandbox Code Playgroud)
df2 好像:
B C
0 1 pq
1 3 rs
2 4 pr
3 5 qs
4 6 sp
Run Code Online (Sandbox Code Playgroud)
我想将这两者结合起来形成res:
res=\
pd.DataFrame.from_dict({'A':['xy','yx','zy','zz'],
'C':['pq','pr','rs','sp']})
Run Code Online (Sandbox Code Playgroud)
IE
A C
0 xy pq
1 yx pr
2 zy rs
3 zz sp
Run Code Online (Sandbox Code Playgroud)
带有xyin的行df有 lsit [1,3]。1中的列B中有一行带有值df2。该C列具有值pq该行中,所以我结合xy使用pq。接下来的两行相同。最后一行:in 列B中没有 2 的值df2,所以我选择该值6(indf中的最后一行有 list [2,6])。
如何在不遍历数据帧的情况下实现这一目标?
西班牙语 SO 中的一个非常相似的帖子,启发了这篇文章。
您可以将explode“B”分成单独的行,然后在“B”上合并并删除重复项。
非常感谢 Asish M. 在评论中指出了一个潜在的排序错误。
(df.explode('B')
.merge(df2, on='B', how='left')
.dropna(subset=['C'])
.drop_duplicates('A'))
A B C
0 xy 1 pq
2 yx 4 pr
5 zy 3 rs
7 zz 6 sp
Run Code Online (Sandbox Code Playgroud)
理想情况下,以下应该有效:
df.explode('B').merge(df2).drop_duplicates('A')
Run Code Online (Sandbox Code Playgroud)
但是,pandas(截至撰写时,版本 1.2dev)不会保留合并时左键的顺序,这是一个错误,请参阅 GH18776。
同时,我们可以使用左合并的解决方法,如上所示。
| 归档时间: |
|
| 查看次数: |
77 次 |
| 最近记录: |