熊猫:以独特的价值观为条件

时间:2014-01-17 12:05:22

标签: python pandas set concatenation

我正在连接两个Pandas数据帧,如下所示。

part1 = pd.DataFrame({'id'    :[100,200,300,400,500], 
                   'amount': np.random.randn(5)
                    })

part2 = pd.DataFrame({'id'    :[700,100,800,500,300], 
                   'amount': np.random.randn(5)
                    })

concatenated = pd.concat([part1, part2], axis=0)
     amount   id
0 -0.458653  100
1  2.172348  200
2  0.072494  300
3 -0.253939  400
4 -0.061866  500
0 -1.187505  700
1 -0.810784  100
2  0.321881  800
3 -1.935284  500
4 -1.351507  300

如果行part2尚未出现在concatenated中,我如何限制操作,以便id中的行只包含在part1中?在某种程度上,我想将id列视为一组。

是否可以在concat()期间执行此操作,或者这更像是后处理步骤?

此示例的所需输出为:

concatenated_desired
     amount   id
0 -0.458653  100
1  2.172348  200
2  0.072494  300
3 -0.253939  400
4 -0.061866  500
0 -1.187505  700
2  0.321881  800

3 个答案:

答案 0 :(得分:2)

如果您获得了id的列,请将其用作索引。使用真实索引执行操作会使事情变得更容易。在这里,您可以使用combine_first来完成您要搜索的内容:

part1 = part1.set_index('id')

part2 = part2.set_index('id')

part1.combine_first(p2)
Out[38]: 
       amount
id           
100  1.685685
200 -1.895151
300 -0.804097
400  0.119948
500 -0.434062
700  0.215255
800 -0.031562

如果您真的不需要获取该索引,请在以下后重置:

part1.combine_first(p2).reset_index()
Out[39]: 
    id    amount
0  100  1.685685
1  200 -1.895151
2  300 -0.804097
3  400  0.119948
4  500 -0.434062
5  700  0.215255
6  800 -0.031562

答案 1 :(得分:2)

drop_duplicates()之后致电concat()

part1 = pd.DataFrame({'id'    :[100,200,300,400,500], 
                   'amount': np.arange(5)
                    })

part2 = pd.DataFrame({'id'    :[700,100,800,500,300], 
                   'amount': np.random.randn(5)
                    })

concatenated = pd.concat([part1, part2], axis=0)
print concatenated.drop_duplicates(cols="id")

答案 2 :(得分:1)

计算id不在part1

In [28]:
diff = part2.ix[~part2['id'].isin(part1['id'])]
diff

Out[28]:
     amount   id
0 -2.184038  700
2 -0.070749  800

现在concat

In [29]:
concatenated = pd.concat([part1, diff], axis=0)
concatenated

Out[29]:
     amount   id
0 -2.240625  100
1 -0.348184  200
2  0.281050  300
3  0.082460  400
4 -0.045416  500
0 -2.184038  700
2 -0.070749  800

你也可以把它放在一个单一的衬里:

concatenated = pd.concat([part1, part2.ix[~part2['id'].isin(part1['id'])]], axis=0)