在具有重复轴的数据框中插入列

时间:2017-06-09 14:12:05

标签: python pandas dataframe

在一个重复某些索引的pandas数据框中插入一个列的解决方法(或者更整洁的方法)是什么?

例如,拥有以下数据框:

df1 = pd.DataFrame({ 0: (1, 2, 3, 4, 1, 2, 3, 4),
                    1: (51, 51, 74, 29, 39, 3, 14, 16),
                    2: pd.Categorical(['R', 'R', 'R', 'R', 'F', 'F', 'F', 'F']) })
df1 = df1.set_index([0])
df1
    1  2
0       
1  51  R
2  51  R
3  74  R
4  29  R
1  39  F
2   3  F
3  14  F
4  16  F

如何在df1中从foo(下方)插入df2列?

df2 = pd.DataFrame({ 0: (1, 2, 3, 4, 1, 3, 4),
                    'foo': (5, 5, 7, 2, 3, 1, 1),
                    2: pd.Categorical(['R', 'R', 'R', 'R', 'F', 'F', 'F']) })
df2 = df2.set_index([0])
df2
   foo  2
0        
1    5  R
2    5  R
3    7  R
4    2  R
1    3  F
3    1  F
4    1  F

请注意,类别2中缺少索引F

我希望结果如下:

    1  foo  2
0            
1  51    5  R
2  51    5  R
3  74    7  R
4  29    2  R
1  39    3  F
2   3  NaN  F
3  14    1  F
4  16    1  F

我尝试了DataFrame.insert方法但是得到了

df1.insert(2, 'FOO', df2['foo'])
ValueError: cannot reindex from a duplicate axis

3 个答案:

答案 0 :(得分:2)

索引和列 2 在两个数据框上唯一地定义一行,您可以在两列上进行连接(在重置索引之后):

df1.reset_index().merge(df2.reset_index(), how='left', on=[0,2]).set_index([0])

#    1  2   foo
#0          
#1  51  R   5.0
#2  51  R   5.0
#3  74  R   7.0
#4  29  R   2.0
#1  39  F   3.0
#2  3   F   NaN
#3  14  F   1.0
#4  16  F   1.0

答案 1 :(得分:1)

你非常接近......

正如您基于您的问题已经知道的那样,您不能出于错误中明确说明的原因而执行此操作,因为您有重复的索引。如果您必须将列'0'作为索引,那么在合并之前不要将其设置为索引,请在之后设置:

df1 = pd.DataFrame({ 0: (1, 2, 3, 4, 1, 2, 3, 4),
                1: (51, 51, 74, 29, 39, 3, 14, 16),
                2: pd.Categorical(['R', 'R', 'R', 'R', 'F', 'F', 'F', 'F']) })
df2 = pd.DataFrame({ 0: (1, 2, 3, 4, 1, 3, 4),
                'foo': (5, 5, 7, 2, 3, 1, 1),
                2: pd.Categorical(['R', 'R', 'R', 'R', 'F', 'F', 'F']) })
df = df1.merge(df2, how='left')

df.set_index([0])

答案 2 :(得分:1)

df1 = pd.DataFrame({ 0: (1, 2, 3, 4, 1, 2, 3, 4),
                1: (51, 51, 74, 29, 39, 3, 14, 16),
                2: pd.Categorical(['R', 'R', 'R', 'R', 'F', 'F', 'F', 'F']) })
df2 = pd.DataFrame({ 0: (1, 2, 3, 4, 1, 3, 4),
                'foo': (5, 5, 7, 2, 3, 1, 1),
                2: pd.Categorical(['R', 'R', 'R', 'R', 'F', 'F', 'F']) })
df1 = df1.set_index([0, 2])
df2 = df2.set_index([0, 2])
df1.join(df2, how='left').reset_index(level=2)
   2   1  foo
0
1  R  51  5.0
2  R  51  5.0
3  R  74  7.0
4  R  29  2.0
1  F  39  3.0
2  F   3  NaN
3  F  14  1.0
4  F  16  1.0