Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.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,我有一个像这样的数据框 A B C 0 A0 B0 X 1 A1 B1 Y 2 A2 B2 X 我想把上面的数据和下面的数据帧合并 df_x A D 0 A0 X0 1 A1 X1 2 A2 X2 3 A3 X3 在合并时,我希望根据列C选择第二个数据帧。在这里,如果C中的值是X,那么我需要使用df\u X与该行合并,同样,如果C中的值是Y则使用df\u Y。所以,最终的输出会是 A B C D 0 A0 B

我有一个像这样的数据框

    A   B  C
0  A0  B0  X
1  A1  B1  Y
2  A2  B2  X
我想把上面的数据和下面的数据帧合并

df_x

    A   D
0  A0  X0
1  A1  X1
2  A2  X2
3  A3  X3
在合并时,我希望根据列
C
选择第二个数据帧。在这里,如果
C
中的值是
X
,那么我需要使用
df\u X
与该行合并,同样,如果
C
中的值是
Y
则使用
df\u Y
。所以,最终的输出会是

    A   B  C   D
0  A0  B0  X  X0
1  A1  B1  Y  Y1
2  A2  B2  X  X2

我们可以使用一些方法,例如,i)迭代每一行并进行处理,或ii)通过为每个
df_x
df_y
添加
C
列进行合并,然后进行合并等。显然,迭代方法效率不高。另一种方法将为包含冗余数据的列消耗额外的空间。有没有更好的方法来实现这一点?

试试以下方法:

import io
df=pd.read_csv(io.StringIO('''A   B  C
0  A0  B0  X
1  A1  B1  Y
2  A2  B2  X'''), sep='\s+', engine='python')

df_x=pd.read_csv(io.StringIO('''    A   D
0  A0  X0
1  A1  X1
2  A2  X2
3  A3  X3'''), sep='\s+', engine='python')

df_y=pd.read_csv(io.StringIO('''    A   D
0  A0  Y0
1  A1  Y1
2  A2  Y2
3  A3  Y3'''), sep='\s+', engine='python')
# print(df)
# print(df_x)
# print(df_y)

dfx = df[df.C == 'X']
# print(dfx)

dfy = df[df.C == 'Y']
# print(dfy)

df1 = dfx.merge(df_x, left_on='A', right_on='A')
df2 = dfy.merge(df_y, left_on='A', right_on='A')
print(df1)
print(df2)

df_final = pd.concat([df1, df2]).sort_values('A')
输出

    A   B   C   D
0   A0  B0  X   X0
0   A1  B1  Y   Y1
1   A2  B2  X   X2
试试这个:

import io
df=pd.read_csv(io.StringIO('''A   B  C
0  A0  B0  X
1  A1  B1  Y
2  A2  B2  X'''), sep='\s+', engine='python')

df_x=pd.read_csv(io.StringIO('''    A   D
0  A0  X0
1  A1  X1
2  A2  X2
3  A3  X3'''), sep='\s+', engine='python')

df_y=pd.read_csv(io.StringIO('''    A   D
0  A0  Y0
1  A1  Y1
2  A2  Y2
3  A3  Y3'''), sep='\s+', engine='python')
# print(df)
# print(df_x)
# print(df_y)

dfx = df[df.C == 'X']
# print(dfx)

dfy = df[df.C == 'Y']
# print(dfy)

df1 = dfx.merge(df_x, left_on='A', right_on='A')
df2 = dfy.merge(df_y, left_on='A', right_on='A')
print(df1)
print(df2)

df_final = pd.concat([df1, df2]).sort_values('A')
输出

    A   B   C   D
0   A0  B0  X   X0
0   A1  B1  Y   Y1
1   A2  B2  X   X2

没有直接的方法,但是
merge
可以完成这项工作

df_new = df.merge(df_x, 'left', ['A', 'B','C', 'D'],  suffixes=('*x', '*y')).groupby(lambda x: x.split('*')[0], axis=1).last()

df_new = df.merge(df_y, 'left', ['A', 'B','C', 'D'],  suffixes=('*x', '*y')).groupby(lambda x: x.split('*')[0], axis=1).last()


试试这样的。这可能不是直接的答案。但是,通过理解上述代码,您可以轻松地完成这项工作。

没有直接的方法,但是
merge
可以完成这项工作

df_new = df.merge(df_x, 'left', ['A', 'B','C', 'D'],  suffixes=('*x', '*y')).groupby(lambda x: x.split('*')[0], axis=1).last()

df_new = df.merge(df_y, 'left', ['A', 'B','C', 'D'],  suffixes=('*x', '*y')).groupby(lambda x: x.split('*')[0], axis=1).last()

试试这样的。这可能不是直接的答案。但是,通过理解上述代码,您可以轻松地完成这项工作