串联2个数据框。我想合并重复的列

时间:2020-07-30 15:59:29

标签: 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], 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

我知道我可以沿axis = 0进行串联。不幸的是,这只能解决这个小例子的问题。我正在使用的实际代码更加复杂。沿轴= 0串联将导致索引重复。我也不想要。

编辑:

人们要求我给出一个更复杂的示例来描述为什么简单地删除'axis = 1'无效。这是一个更复杂的示例,首先包含axis = 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    
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    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    C    
1   10   20
2   11   21
3   12   22
4   10  NaN
5   11  NaN
6   12  NaN

对不起,目前还不清楚。希望对您有所帮助。

2 个答案:

答案 0 :(得分:1)

编辑:

如果需要沿着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

答案 1 :(得分:1)

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

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):

t = pd.concat([pd.DataFrame(dic).set_index('A'),
               pd.DataFrame(dic2).set_index('A'),
               pd.DataFrame(dic3).set_index('A')])

第2步:将col'B'的非空元素与col'C'的非空元素连接起来(如果有两列以上,则可以将其放入列表推导中)。现在,我们沿着axis = 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