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()
试试这样的。这可能不是直接的答案。但是,通过理解上述代码,您可以轻松地完成这项工作