如何连接两个Pandas Dataframe ,同时保持两者的顺序?

at0kjp5o  于 2023-02-11  发布在  其他
关注(0)|答案(2)|浏览(111)

我试图比较两个包含新旧值的Pandas Dataframe 。一些id在新数据中被删除,一些被添加,所以索引不相同。我可以使用id作为索引,列作为轴,"第一个"和"第二个"作为键来连接 Dataframe 。但无法找到一种方法来保持两个 Dataframe 的顺序。data1的顺序被保留,但我希望data2的顺序也被保留。
我尝试了:

data1={'id':[1, 2, 3, 4, 5],'value':[10, 25, 12, 100, 26]}
data2={'id':[1, 2, 6, 4, 5],'value':[10, 24, 48, 100, 60]}

df = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df_both = pd.concat([df.set_index('id'), df2.set_index('id')], 
               axis='columns', keys=['First', 'Second'])

print(df_both)

生成df_both:

First Second
    value  value
id
1    10.0   10.0
2    25.0   24.0
3    12.0    NaN
4   100.0  100.0
5    26.0   60.0
6     NaN   48.0

ID6被放置在 Dataframe 的底部,因为索引不存在于DATA1中。
作为结果df_both我想要什么:

First Second
    value  value
id
1    10.0   10.0
2    25.0   24.0
3    12.0    NaN
6     NaN   48.0
4   100.0  100.0
5    26.0   60.0

我希望删除的行和新的行保持它们的位置。

xwbd5t1u

xwbd5t1u1#

没有直接的方法可以做到这一点:

idx = pd.Index(pd.concat([df['id'], df2['id']]).sort_index().drop_duplicates())
df_both = (pd.concat([df.set_index('id'),
                      df2.set_index('id')],
                      axis=1, keys=['First', 'Second'])
             .reindex(idx))
print(df_both)

# Output
    First Second
    value  value
id              
1    10.0   10.0
2    25.0   24.0
3    12.0    NaN
6     NaN   48.0
4   100.0  100.0
5    26.0   60.0
5sxhfpxr

5sxhfpxr2#

您可以按照所需顺序连接临时列上的 Dataframe ,然后重置索引以获得所需结果。

data1 = {'id': [1, 2, 3, 4, 5], 'value': [10, 25, 12, 100, 26]}
data2 = {'id': [1, 2, 6, 4, 5], 'value': [10, 24, 48, 100, 60]}

df = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

df['temp'] = range(len(df))
df2['temp'] = range(len(df), len(df) + len(df2))

df_both = pd.concat([df, df2], ignore_index=True)

df_both = df_both.sort_values(by='temp').drop('temp', axis=1)

df_both = df_both.set_index('id')

df_both.columns = pd.MultiIndex.from_product([['First', 'Second'], ['value']])

print(df_both)

相关问题