Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python `pandas.merge`无法识别相同的索引_Python_Pandas_Dataframe - Fatal编程技术网

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

Python `pandas.merge`无法识别相同的索引,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个列重叠但索引相同的数据帧,我想将它们组合起来。我觉得这应该是直截了当的,但我已经通过了太多的例子和问题,它不起作用,但似乎与其他例子不一致 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 = p

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

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
在完成这里的所有示例()之后,我确信我找到了正确的示例(合并的第一个和第二个示例)。第二个例子是:

In [43]: result = pd.merge(left, right, on=['key1', 'key2'])
在他们的示例中,他们有两个DFs(左和右),它们具有重叠的列和相同的索引,并且它们生成的数据帧具有每个列和原始索引的一个版本,但我这样做时不会发生这种情况:

# 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没有看到索引是相同的!我在选项上做了手脚,但没有得到我想要的结果

这里有人问了一个类似但不同的问题,但我并不真正理解答案,因此无法将其与我的问题联系起来

此特定示例的要点:

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

对于这个特定的问题有一个解决方案是很好的,但我也很想理解它,因为我发现自己经常花很多时间来组合数据帧。我喜欢pandas,一般来说我觉得它非常直观,但除了简单的数据帧组合之外,我似乎对任何事情都不满意。

从v0.23开始,您可以为join键指定索引名(如果有)

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 
这里的假设是,您的实际数据帧在重叠列中没有完全相同的值。如果他们这样做了,那么您的问题将是串联-您可以使用
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

在这种特殊情况下,您可以使用
分配

df
中的内容优先,但包括
df1
中的所有其他内容

df1.assign(**df)

   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
**df
解包
df
假设字典上下文。此解包将关键字参数传递给
assign
,列的名称作为关键字,列作为参数

这和

df1.assign(gen1=df.gen1, gen3=df.gen3, gen4=df.gen4)

谢谢@coldspeed,但是您的行
df.merge(df1,on=list(set(df).intersection(set(df1))|{'idx'}))
返回
key错误:“idx'
。索引都被命名为“idx”,是不是
df['idx']
可能会返回相同的错误?@ojunk实际上我认为您的熊猫可能需要更新,这只适用于最新版本。是的,您是对的-很抱歉您在回答中说我刚刚忘记了。谢谢