连接/合并数据框并保留行顺序

时间:2019-07-18 10:23:58

标签: python pandas dataframe

我在pythonpandas工作。

让我们假设我有以下两个数据帧df_1df_2 (输入)

# 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()并没有做到这一点

3 个答案:

答案 0 :(得分:2)

我认为这是错误。

左连接的可能解决方案:

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

答案 1 :(得分:1)

一种快速的方法是:

df_2=df_2.set_index(['A','B'])

temp = df_1.set_index(['A','B'])

df_2.update(temp)

df_2.reset_index(inplace=True)

正如我在上面与@jezrael讨论的那样,并且如果我没有丢失任何内容,那么如果您既不需要原始数据帧中的列C,又只需要匹配的列C值,那么.update()是最快的方法,因为您不必删除不需要的列。

答案 2 :(得分:0)

您可以在两个数据框之间使用索引

print(df)
#    A  B    C
# 0  5  1  1.0
# 1  2  7  NaN
# 2  3  3  NaN
# 3  5  0  NaN

df = df.set_index('B')
df = df.reindex(index=df_2['B'])
df = df.reset_index()
df = df[['A', 'B', 'C']]

print(df)
#    A    B    C
# 0  2  7.0  NaN
# 1  5  1.0  1.0
# 2  3  3.0  NaN
# 3  5  0.0  NaN

Source