Python/Pandas从数据帧中过滤出唯一的行
我有两个或三个重复行的数据帧Python/Pandas从数据帧中过滤出唯一的行,python,pandas,Python,Pandas,我有两个或三个重复行的数据帧 In [31]: df1 Out[31]: member time 0 0 2009-09-30 12:00:00 1 0 2009-09-30 18:00:00 2 0 2009-10-01 00:00:00 3 1 2009-09-30 12:00:00 4 1 2009-09-30 18:00:00 5 2 2009-09-30 12:00:00 6
In [31]: df1
Out[31]:
member time
0 0 2009-09-30 12:00:00
1 0 2009-09-30 18:00:00
2 0 2009-10-01 00:00:00
3 1 2009-09-30 12:00:00
4 1 2009-09-30 18:00:00
5 2 2009-09-30 12:00:00
6 3 2009-09-30 12:00:00
...
In [32]: df2
Out[32]:
member time
0 0 2009-09-30 12:00:00
1 0 2009-09-30 18:00:00
3 1 2009-09-30 12:00:00
4 2 2009-09-30 12:00:00
5 2 2009-09-30 18:00:00
6 2 2009-10-01 00:00:00
...
我想从df1和df2中筛选出具有唯一值'member'和'time'的行,并获得一个数据帧,该数据帧中只有在df1和df2中具有公共值'member'和'time'的行,即
In [33]: df_duplicated_1_and_2
Out[33]:
member time
0 0 2009-09-30 12:00:00
1 0 2009-09-30 18:00:00
3 1 2009-09-30 12:00:00
4 2 2009-09-30 12:00:00
...
有没有一种高效、优雅的方法可以做到这一点
更新如果可能,我希望得到的不是新的合并数据帧,而是经过过滤的数据帧。e、 g
In [34]: df1
Out[34]:
member time value
0 0 2009-09-30 12:00:00 a
1 0 2009-09-30 18:00:00 b
2 0 2009-10-01 00:00:00 c
3 1 2009-09-30 12:00:00 d
4 1 2009-09-30 18:00:00 e
5 2 2009-09-30 12:00:00 f
6 3 2009-09-30 12:00:00 g
...
In [35]: df1_filtered_out
Out[35]:
member time value
0 0 2009-09-30 12:00:00 a
1 0 2009-09-30 18:00:00 b
3 1 2009-09-30 12:00:00 d
4 2 2009-09-30 12:00:00 g
...
并获取过滤后的df2。在
成员
和时间
列上进行内部联接:
>>> df1.merge(df2, on=['member', 'time'], how='inner')
member time
0 0 2009-09-30 12:00:00
1 0 2009-09-30 18:00:00
2 1 2009-09-30 12:00:00
3 2 2009-09-30 12:00:00
这将产生一个结果,即两个数据帧中只有具有相同成员
和时间
值的行
更新:
>>> df1.merge(df2[['member', 'time']])
member time value
0 0 2009-09-30 12:00:00 a
1 0 2009-09-30 18:00:00 b
2 1 2009-09-30 12:00:00 d
3 2 2009-09-30 12:00:00 f
默认情况下,合并是“内部”的,因此不需要
how
参数。@EdChum我知道,但我明确指定了how
参数来显示OP如果他决定做不同的事情,他如何将此行为更改为right
、left
或outer
。但是是的,这是一个有用的评论+1.感谢您的回答和评论。您的答案与我想做的几乎相同,但我希望得到“过滤”数据帧,而不是“合并”。你能告诉我怎样过滤掉重复的原料吗?(更新我的问题)@Tetsuro答案是一样的。只需从df2框架中选择列:df1.merge(df2[['member','time']])
@Tetsuro同样,由于这是布尔索引,您无法获得视图,无论您做什么,都将获得副本。