Python 如何使用条件合并数据帧?
假设我有以下输入数据帧 df1 以及下面的查找数据帧 df2 最终输出dfPython 如何使用条件合并数据帧?,python,pandas,dataframe,Python,Pandas,Dataframe,假设我有以下输入数据帧 df1 以及下面的查找数据帧 df2 最终输出df col1_1 | col1_or_col2 | col2.... AB0123 | abc | 0678 | ghi | AB0567 | dfe | 0921 | jkl | 6752 | mno | 我想到的是在输出df中创建两个temp列,然后生成一个单独的函数*来生成col1\u或col2 *该函数
col1_1 | col1_or_col2 | col2....
AB0123 | abc |
0678 | ghi |
AB0567 | dfe |
0921 | jkl |
6752 | mno |
我想到的是在输出df中创建两个temp列,然后生成一个单独的函数*来生成col1\u或col2
*该函数将检查每一行,并获取temp_col2或temp_col3之间的最终非空值
col1 | temp_col1 | temp_col2 | col1_or_col2
AB0123 | abc | | abc
0678 | | ghi | ghi
AB0567 | dfe | | dfe
0921 | | jkl | jkl
6752 | | mno | mno
是否有一个pandas函数可以有效地解决上述问题?除了我的评论之外,您还可以优雅地结合
pop
。此代码通过使用col2
值填充col1
中的NaN
值来更新第二个数据帧df2
的col1
,同时使用pop
从数据帧中删除现在不必要的col2
。现在,您将这个新的df2
与df1
合并。在合并之前,确保合并列为对象
数据类型(例如df2['col1']=df2['col1'].astype(str)
,并对其他列执行相同操作,或使用df2.info()检查数据类型
):
这是merge
中零件的输出,以及您合并到df1
中的内容:
df2.assign(col1=df2['col1'].fillna(df2.pop('col2')))
col1 col3
0 AB0123 abc
1 AB0567 dfe
2 O678 ghi
3 O921 jkl
4 6752 mno
让我们尝试concat df2和df1,并删除col1
df2=df2.assign(col1=df2.col2.astype(str)+df2.col1).drop(columns=['col2'])
如果存在隐藏的关系,则执行以下操作
通过连接df2.col1
和df2.col3
创建新的datframedf3
df3=df2.assign(col1=df2.col2.astype(str)+df2.col1).drop(columns=['col2'])
从df3
创建dict。dict将df3.col1
作为键,将df3.col3
作为值。将其映射到df1.col1
如下
df1['col2']=df1.col1.map(dict(zip(df3.col1,df3.col3)))
col1_1 col2
0 AB0123 abc
1 O678 ghi
2 AB0567 dfe
3 O921 jkl
4 6752 mno
这意味着什么:“基于查找df1中的col2和col3”?为什么要将col2值转换为col1?你能再详细解释一下逻辑吗?请添加一个“输入”数据框架的示例。我编辑了这个问题,希望它能提供更多的见解@Dani MesejoI编辑了这个问题,希望它能为你的答案提供更多的见解@AnkyTanks。我可以知道你所说的“请注意,我将“0”改为“O”是什么意思吗?因为它删除了我使用的
pd.read_剪贴板()的前导“0”@royalewithcheese
读取stackoverflow数据,它将df2
的col2
中的一个读取为整数,并删除了零,这意味着数据没有正确合并。这与我如何将stackoverflow数据传输到我的jupyter笔记本有关。好的,明白了,谢谢!df在第1列的基础上进行合并似乎只有这样s、 …因此,不是从col3到col2获取相应的数据,而是从col3获取与col1相关的数据
df2.assign(col1=df2['col1'].fillna(df2.pop('col2')))
col1 col3
0 AB0123 abc
1 AB0567 dfe
2 O678 ghi
3 O921 jkl
4 6752 mno
df3=df2.assign(col1=df2.col2.astype(str)+df2.col1).drop(columns=['col2'])
df1['col2']=df1.col1.map(dict(zip(df3.col1,df3.col3)))
col1_1 col2
0 AB0123 abc
1 O678 ghi
2 AB0567 dfe
3 O921 jkl
4 6752 mno