Python 3.x 连接2个数据帧。我想合并重复的列

Python 3.x 连接2个数据帧。我想合并重复的列,python-3.x,pandas,Python 3.x,Pandas,以下代码可以用作我遇到的问题的示例: dic={'A':['1','2','3'], 'B':['10','11','12']} df1=pd.DataFrame(dic) df1.set_index('A', inplace=True) dic2={'A':['4','5','6'], 'B':['10','11','12']} df2=pd.DataFrame(dic2) df2.set_index('A', inplace=True) df3=pd.concat([df1,df2],

以下代码可以用作我遇到的问题的示例:

dic={'A':['1','2','3'], 'B':['10','11','12']}
df1=pd.DataFrame(dic)
df1.set_index('A', inplace=True)

dic2={'A':['4','5','6'], 'B':['10','11','12']}
df2=pd.DataFrame(dic2)
df2.set_index('A', inplace=True)

df3=pd.concat([df1,df2], axis=1)
print(df3)
我从这个连接中得到的结果是:

     B    B
1   10  NaN
2   11  NaN
3   12  NaN
4  NaN   10
5  NaN   11
6  NaN   12
我希望:

     B    
1   10 
2   11 
3   12 
4   10
5   11
6   12
     B    C    
1   10   20
2   11   21
3   12   22
4   10  NaN
5   11  NaN
6   12  NaN
     B    C    
1   10   20
2   11   21
3   12   22
4   10  NaN
5   11  NaN
6   12  NaN
我知道我可以沿轴=0连接。不幸的是,这只解决了这个小例子的问题。我正在使用的实际代码更复杂。沿轴=0连接会导致索引重复。我也不想那样

编辑:

人们要求我举一个更复杂的例子来说明为什么简单地删除“axis=1”不起作用。下面是一个更复杂的示例,首先包括轴=1:

dic={'A':['1','2','3'], 'B':['10','11','12']}
df1=pd.DataFrame(dic)
df1.set_index('A', inplace=True)

dic2={'A':['4','5','6'], 'B':['10','11','12']}
df2=pd.DataFrame(dic2)
df2.set_index('A', inplace=True)

df=pd.concat([df1,df2], axis=1)

dic3={'A':['1','2','3'], 'C':['20','21','22']}
df3=pd.DataFrame(dic3)
df3.set_index('A', inplace=True)

df4=pd.concat([df,df3], axis=1)
print(df4)
这给了我:

     B    B    C
1   10  NaN   20
2   11  NaN   21
3   12  NaN   22
4  NaN   10  NaN
5  NaN   11  NaN
6  NaN   12  NaN
     B    C
A          
1   10  NaN
2   11  NaN
3   12  NaN
4   10  NaN
5   11  NaN
6   12  NaN
1  NaN   20
2  NaN   21
3  NaN   22
我希望:

     B    
1   10 
2   11 
3   12 
4   10
5   11
6   12
     B    C    
1   10   20
2   11   21
3   12   22
4   10  NaN
5   11  NaN
6   12  NaN
     B    C    
1   10   20
2   11   21
3   12   22
4   10  NaN
5   11  NaN
6   12  NaN
下面是一个删除轴=1的示例:

dic={'A':['1','2','3'], 'B':['10','11','12']}
df1=pd.DataFrame(dic)
df1.set_index('A', inplace=True)

dic2={'A':['4','5','6'], 'B':['10','11','12']}
df2=pd.DataFrame(dic2)
df2.set_index('A', inplace=True)

df=pd.concat([df1,df2])

dic3={'A':['1','2','3'], 'C':['20','21','22']}
df3=pd.DataFrame(dic3)
df3.set_index('A', inplace=True)

df4=pd.concat([df,df3])
print(df4)
这给了我:

     B    B    C
1   10  NaN   20
2   11  NaN   21
3   12  NaN   22
4  NaN   10  NaN
5  NaN   11  NaN
6  NaN   12  NaN
     B    C
A          
1   10  NaN
2   11  NaN
3   12  NaN
4   10  NaN
5   11  NaN
6   12  NaN
1  NaN   20
2  NaN   21
3  NaN   22
我希望:

     B    
1   10 
2   11 
3   12 
4   10
5   11
6   12
     B    C    
1   10   20
2   11   21
3   12   22
4   10  NaN
5   11  NaN
6   12  NaN
     B    C    
1   10   20
2   11   21
3   12   22
4   10  NaN
5   11  NaN
6   12  NaN
对不起,不太清楚。我希望这能有所帮助。

编辑:

如果需要沿axis=1添加两个对象,则将追加新列。如果axis=0或默认值,则相同列将追加新值

请参阅以下解决方案:

import pandas as pd

dic={'A':['1','2','3'], 'B':['10','11','12']}
df1=pd.DataFrame(dic)
df1.set_index('A', inplace=True)

dic2={'A':['4','5','6'], 'B':['10','11','12']}
df2=pd.DataFrame(dic2)
df2.set_index('A', inplace=True)

df=pd.concat([df1,df2]) 

dic3={'A':['1','2','3'], 'C':['20','21','22']}
df3=pd.DataFrame(dic3)
df3.set_index('A', inplace=True)

df4=pd.concat([df,df3],axis=1) #As here C is new new column so need to use axis=1
print(df4)
输出:

    B    C
1  10   20
2  11   21
3  12   22
4  10  NaN
5  11  NaN
6  12  NaN

这里是一个两步流程,例如“编辑”点之后提供的示例。首先创建字典:

import pandas as pd

dic  = {'A':['1','2','3'], 'B':['10','11','12']}
dic2 = {'A':['4','5','6'], 'B':['10','11','12']}
dic3 = {'A':['1','2','3'], 'C':['20','21','22']}
步骤1:使用索引“a”将每个字典转换为数据帧,并连接(沿轴=0):

步骤2:将列“B”的非空元素与列“C”的非空元素连接起来(如果有两列以上,可以将其放入列表中)。现在我们沿轴=1连接:

result = pd.concat([
    t.loc[ t['B'].notna(), 'B' ],
    t.loc[ t['C'].notna(), 'C' ],
], axis=1)

print(result)

    B    C
1  10   20
2  11   21
3  12   22
4  10  NaN
5  11  NaN
6  12  NaN

df3=pd.concat([df1,df2])
,不带
。如果您的真实示例“更复杂”,我建议您创建一个代表该问题的示例,以便获得所需的答案。抱歉,我已编辑原始问题以更能代表该问题。请查看更新的问题。我的问题比我最初使用的样本要复杂一点。我已经包括了一个更好的例子,它更能代表我的问题。我已经更新了解决方案,你可以参考。我通过列表理解做到了这一点,就像你推荐的那样,它就像一个魅力。谢谢