gpt4 book ai didi

python - `pandas.merge` 无法识别相同的索引

转载 作者:行者123 更新时间:2023-11-28 21:34:14 24 4
gpt4 key购买 nike

我有两个具有重叠列但索引相同的数据框,我想将它们组合起来。我觉得这应该是直截了当的,但我已经解决了很多示例和问题,但它不起作用,而且似乎与其他示例不一致。

import pandas as pd
# create test data
df = pd.DataFrame({'gen1': [1, 0, 0, 1, 1], 'gen3': [1, 0, 0, 1, 0], 'gen4': [0, 1, 1, 0, 1]}, index = ['a', 'b', 'c', 'd', 'e'])
df1 = pd.DataFrame({'gen1': [1, 0, 0, 1, 1], 'gen2': [0, 1, 1, 1, 1], 'gen3': [1, 0, 0, 1, 0]}, index = ['a', 'b', 'c', 'd', 'e'])

In [1]: df
Out[1]:
gen1 gen2 gen3
a 1 0 1
b 0 1 0
c 0 1 0
d 1 1 1
e 1 1 0

In [2]: df1
Out[2]:
gen1 gen3 gen4
a 1 1 0
b 0 0 1
c 0 0 1
d 1 1 0
e 1 0 1

完成此处的所有示例 ( https://pandas.pydata.org/pandas-docs/stable/merging.html ) 后,我确信我找到了正确的示例(合并的第一个和第二个示例)。第二个例子是这样的:

In [43]: result = pd.merge(left, right, on=['key1', 'key2'])

在他们的示例中,他们有两个 DF(左和右),它们具有重叠的列和相同的索引,并且它们生成的数据帧具有每列和原始索引的一个版本,但这不是我这样做时发生的情况:

# get the intersection of columns (I need this to be general)
In [3]: column_intersection = list(set(df).intersection(set(df1))

In [4]: pd.merge(df, df1, on=column_intersection)
Out[4]:
gen1 gen2 gen3 gen4
0 1 0 1 0
1 1 0 1 0
2 1 1 1 0
3 1 1 1 0
4 0 1 0 1
5 0 1 0 1
6 0 1 0 1
7 0 1 0 1
8 1 1 0 1

这里我们看到merge并没有看到索引是一样的!我摆弄了选项,但无法得到我想要的结果。

这里提出了类似但不同的问题 How to keep index when using pandas merge但我不太明白答案,因此无法将其与我的问题联系起来。

此具体示例的要点:

  • 索引始终相同。
  • 具有相同名称的列将始终具有相同的条目(即它们是重复的)。

如果能为这个特定问题找到一个解决方案,那就太好了,但我也很想理解它,因为我发现自己不时花费大量时间组合数据帧。我喜欢 pandas,总的来说,我发现它非常直观,但除了简单的数据帧组合之外,我似乎无法适应任何其他东西。

最佳答案

从 v0.23 开始,您可以为连接键指定索引名称(如果有的话)。

df.index.name = df1.index.name = 'idx'
df.merge(df1, on=list(set(df).intersection(set(df1)) | {'idx'}))

gen1 gen3 gen4 gen2
idx
a 1 1 0 0
b 0 0 1 1
c 0 0 1 1
d 1 1 0 1
e 1 0 1 1

这里的假设是您的实际 DataFrame 在重叠列中没有完全相同的值。如果他们这样做了,那么您的问题将是串联之一 - 您可以使用 pd.concat 来实现:

c = list(set(df).intersection(set(df1)))
pd.concat([df1, df.drop(c, 1)], axis=1)

gen1 gen2 gen3 gen4
a 1 0 1 0
b 0 1 0 1
c 0 1 0 1
d 1 1 1 0
e 1 1 0 1

关于python - `pandas.merge` 无法识别相同的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53656467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com