繁体   English   中英

如何在熊猫数据框中保留前两个重复项?

[英]How to keep first two duplicates in a pandas dataframe?

关于在数据框中查找重复项并使用特定列删除数据框中的重复项,我有一个问题。 这是我要完成的工作:

是否可以删除重复项但保留前两个?

这是我当前的数据框df的示例,请看一下下面放置的方括号内的注释,以使您有所了解。

注意:如果'Roll'= 1,那么我想查看Date列,看看该列中是否还有第二个重复的Date ...保留这两个并删除其他任何日期。

    Date    Open    High     Low      Close  Roll  Dupes
1  19780106  236.00  237.50  234.50  235.50     0    NaN
2  19780113  235.50  239.00  235.00  238.25     0    NaN
3  19780120  238.00  239.00  234.50  237.00     0    NaN
4  19780127  237.00  238.50  235.50  236.00     1    NaN (KEEP)  
5  19780203  236.00  236.00  232.25  233.50     0    NaN (KEEP)
6  19780127  237.00  238.50  235.50  236.00     0    NaN (KEEP)
7  19780203  236.00  236.00  232.25  233.50     0    NaN (DELETE)
8  19780127  237.00  238.50  235.50  236.00     0    NaN (DELETE)
9  19780203  236.00  236.00  232.25  233.50     0    NaN (DELETE)

这是当前正在删除重复对象的东西,但正在删除所有重复对象(显然)

df = df.drop_duplicates('Date')

编辑:我忘了提些什么,我要保留的唯一重复项是,如果列'Roll'= 1,如果保留的话,则保留该行以及根据列'Date'匹配的下一行

head与groupby一起使用可在每个组中保留前x个条目,我认为这可以满足您的要求。

In [52]: df.groupby('Date').head(2)
Out[52]: 
       Date   Open   High     Low   Close  Roll
1  19780106  236.0  237.5  234.50  235.50     0
2  19780113  235.5  239.0  235.00  238.25     0
3  19780120  238.0  239.0  234.50  237.00     0
4  19780127  237.0  238.5  235.50  236.00     0
5  19780203  236.0  236.0  232.25  233.50     0
6  19780127  237.0  238.5  235.50  236.00     0
7  19780203  236.0  236.0  232.25  233.50     0

编辑:

In [16]: df['dupe_count'] = df.groupby('Date')['Roll'].transform('max') + 1

In [17]: df.groupby('Date', as_index=False).apply(lambda x: x.head(x['dupe_count'].iloc[0]))
Out[17]: 
         Date   Open   High     Low   Close  Roll  Dupes  dupe_count
0 1  19780106  236.0  237.5  234.50  235.50     0    NaN           1
1 2  19780113  235.5  239.0  235.00  238.25     0    NaN           1
2 3  19780120  238.0  239.0  234.50  237.00     0    NaN           1
3 4  19780127  237.0  238.5  235.50  236.00     1    NaN           2
  6  19780127  237.0  238.5  235.50  236.00     0    NaN           2
4 5  19780203  236.0  236.0  232.25  233.50     0    NaN           1

假设Roll只能取值0和1,如果您这样做

df.groupby(['Date', 'Roll'], as_index=False).first() 

您将获得两行日期,其中某一行的Roll = 1 ,只有一行日期的Roll = 0 ,这就是您想要的。
如果通过as_index=False传递,则组密钥不会像您的注释中所讨论的那样最终出现在索引中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM