python - 连接/合并数据帧并保留行顺序

标签 python pandas dataframe

我使用 pythonpandas 工作。

假设我有以下两个数据帧 df_1df_2 (INPUT):

# df1
    A   B   C
0   2   8   6
1   5   2   5
2   3   4   9
3   5   1   1

# df2
    A   B   C
0   2   7   NaN
1   5   1   NaN
2   3   3   NaN
3   5   0   NaN

我想处理它以加入/合并它们以获得一个新的数据框,它看起来像(预期输出):

    A   B   C
0   2   7   NaN
1   5   1   1
2   3   3   NaN
3   5   0   NaN

所以基本上它是一个右合并/连接,但保留了原始右数据帧的顺序。

但是,如果我这样做:

df_2 = df_1.merge(df_2[['A', 'B']], on=['A', 'B'], how='right')

然后我得到这个:

    A   B   C
0   5   1   1.0
1   2   7   NaN
2   3   3   NaN
3   5   0   NaN

因此,我连接/合并了正确的行,但输出数据帧的行顺序与原始正确数据帧的行顺序不同。

如何进行连接/合并并保留行顺序?

创建原始数据帧的代码如下:

import pandas as pd
import numpy as np

columns = ['A', 'B', 'C']
data_1 = [[2, 5, 3, 5], [8, 2, 4, 1], [6, 5, 9, 1]]
data_1 = np.array(data_1).T
df_1 = pd.DataFrame(data=data_1, columns=columns)

columns = ['A', 'B', 'C']
data_2 = [[2, 5, 3, 5], [7, 1, 3, 0], [np.nan, np.nan, np.nan, np.nan]]
data_2 = np.array(data_2).T
df_2 = pd.DataFrame(data=data_2, columns=columns)
<小时/>

我认为通过使用 .join().update() 我可以获得我想要的东西,但首先我感到非常惊讶.merge() 也没有做这个非常简单的事情。

最佳答案

我认为这是错误。

左连接的可能解决方案:

df_2 = df_2.merge(df_1, on=['A', 'B'], how='left', suffixes=('_','')).drop('C_', axis=1)
print (df_2)
     A    B    C
0  2.0  7.0  NaN
1  5.0  1.0  1.0
2  3.0  3.0  NaN
3  5.0  0.0  NaN

关于python - 连接/合并数据帧并保留行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57092373/

相关文章:

python - lxml element.clear() 和访问子元素

python - Pandas 数据框在没有 for 循环的情况下迭代行

python - 何时使用 scikit 学习的 train_test_split

python - 如何根据 pandas 数据框中的数据类型填充 NaN 值?

python-3.x - round() 函数在 apply() 函数中的行为不同

pandas - 根据条件合并 Pandas 中的两个 DataFrame

python - 开放CV : Detect object without displaying the webcam view window

python - 添加语法导致语音识别失败

python - 在 Pandas 中,如何用最接近的非纳米值替换零值?

python - 在 Pandas 中迭代写入 HDF5 存储