Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.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 使用pandas,如何比较两个数据帧中两列之间的值,并将它们推送到新的数据帧?_Python_Pandas_Dataframe - Fatal编程技术网

Python 使用pandas,如何比较两个数据帧中两列之间的值,并将它们推送到新的数据帧?

Python 使用pandas,如何比较两个数据帧中两列之间的值,并将它们推送到新的数据帧?,python,pandas,dataframe,Python,Pandas,Dataframe,所以我是Python新手,我尝试使用Pandas来使用两个现有数据帧中的值创建一个新的数据帧。基本上使用这些数据帧: df1= A B a“1”“3” b'4''3' c'3''2' d'9''1' df2= C D a“5”“1” b“2”“0” c'4''2' d'1''9' 我需要创建一个循环,将df1[a]中每一行的值与df2[C]中每一行的值进行比较。如果值相等,我需要连接df1[A,B]和df2[C],并将该行推送到第三个数据帧。因此,对于上述示例,结果应如下所示: dfnew=

所以我是Python新手,我尝试使用Pandas来使用两个现有数据帧中的值创建一个新的数据帧。基本上使用这些数据帧:

df1=
A B
a“1”“3”
b'4''3'
c'3''2'
d'9''1'

df2=
C D
a“5”“1”
b“2”“0”
c'4''2'
d'1''9'

我需要创建一个循环,将df1[a]中每一行的值与df2[C]中每一行的值进行比较。如果值相等,我需要连接df1[A,B]和df2[C],并将该行推送到第三个数据帧。因此,对于上述示例,结果应如下所示:

dfnew=
A、B、D
“1”“3”“9”
b'4''3''2'

因为不是所有我处理的值都是整数,所以我还需要将这些值视为字符串

我一直在检查其他类似的问题,但似乎没有一个答案能完全满足我的要求。

我认为您需要使用默认的
内部连接
和:

另一种解决方案,具有用于联接的
重命名
列:

df = pd.merge(df1, df2.rename(columns={'C':'A'}), on='A')

print (df)
     A    B    D
0  '1'  '3'  '9'
1  '4'  '3'  '2'
注意:


连接列中的值必须是唯一的。

您也可以使用
pd.Series.map

df1.assign(D=df1.A.map(dict(zip(df2.C, df2.D)))).dropna()

     A    B    D
a  '1'  '3'  '9'
b  '4'  '3'  '2'

详细信息
仅使用
映射
分配
我们就剩下了需要删除的行

df1.assign(D=df1.A.map(df2.set_index('C').D))

     A    B    D
a  '1'  '3'  '9'
b  '4'  '3'  '2'
c  '3'  '2'  NaN
d  '9'  '1'  NaN
我决定用一个简单的
dropna
删除它们。更准确地说,我们可能应该将
dropna
限制为
D

df1.assign(D=df1.A.map(df2.set_index('C').D)).dropna(subset=['D'])

     A    B    D
a  '1'  '3'  '9'
b  '4'  '3'  '2'

我们也可以用其他方法。但这并不是这个问题的真正含义。

第一个问题非常有效!非常感谢!出于好奇,你知道我是否可以使用.drop来删除Bdrop('C',axis=1)
delete only column
C
,因此最简单的方法是在列表中定义要删除的列,如-
。drop(['C','E','F',axis=1)
df1.assign(D=df1.A.map(df2.set_index('C').D)).dropna(subset=['D'])

     A    B    D
a  '1'  '3'  '9'
b  '4'  '3'  '2'