Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用条件合并数据帧?_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何使用条件合并数据帧?

Python 如何使用条件合并数据帧?,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 *该函数

假设我有以下输入数据帧

df1

以及下面的查找数据帧

df2

最终输出df

 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
创建新的datframe
df3

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