使用多个条件从pandas DataFrame中删除行

时间:2017-04-18 01:34:32

标签: pandas dataframe

我正在尝试使用多个条件从pandas DataFrame中删除行。

标准是,如果Trader_x在同一天购买和出售,则删除该日期的买卖行。

这很复杂,因为它要求交易者和日期对于查找是唯一的。如果只有日期匹配买卖,我不想删除行。它必须是trader_x和日期相关的。

我尝试了许多方法,包括数据透视表和合并,但我无法接近工作。

输入数据如下所示:

Trader_ID   Date    Type
Trader_1    5/4/11  Sell
Trader_1    13/4/11 Sell
Trader_1    4/4/12  Sell
Trader_1    3/4/13  Sell
Trader_1    2/5/13  Sell
Trader_1    9/7/13  Sell
Trader_1    5/5/14  Buy
Trader_1    5/5/14  Sell
Trader_1    5/5/15  Buy
Trader_2    5/5/15  Sell
Trader_2    15/3/13 Buy
Trader_2    15/3/13 Sell
Trader_2    1/4/13  Buy
Trader_2    1/4/13  Sell
Trader_2    15/4/13 Buy
Trader_2    15/4/13 Sell
Trader_2    29/4/13 Buy
Trader_2    30/4/13 Sell
Trader_2    22/5/13 Sell

如果有人愿意尝试下面的示例DataFrame。

data = {'trader_id': ['Trader_1','Trader_1','Trader_1','Trader_1','Trader_1','Trader_1','Trader_1',
      'Trader_1','Trader_1','Trader_2','Trader_2','Trader_2','Trader_2','Trader_2','Trader_2',
      'Trader_2','Trader_2','Trader_2','Trader_2'],
     'date': ['1/4/13', '13/4/11', '4/4/12', '3/4/13', '2/5/13', '9/7/13', '5/5/14', '5/5/14', '5/5/15',
      '5/5/15', '15/3/13', '15/3/13', '1/4/13', '1/4/13', '15/4/13', '15/4/13', '29/4/13', '30/4/13', '22/5/13'],
       'type': ['Sell', 'Sell', 'Sell', 'Sell', 'Sell', 'Sell', 'Buy', 'Sell', 'Buy', 'Sell', 'Buy', 
                'Sell', 'Buy', 'Sell', 'Buy', 'Sell', 'Buy', 'Sell', 'Sell']}

df = pd.DataFrame(data)

(示例)数据集的总输入为19行。输出应该只有11行。

输出数据应如下所示:

Trader_ID   Date    Type
Trader_1    5/4/11  Sell
Trader_1    13/4/11 Sell
Trader_1    4/4/12  Sell
Trader_1    3/4/13  Sell
Trader_1    2/5/13  Sell
Trader_1    9/7/13  Sell
Trader_1    5/5/15  Buy
Trader_2    5/5/15  Sell
Trader_2    29/4/13 Buy
Trader_2    30/4/13 Sell
Trader_2    22/5/13 Sell

会喜欢这方面的指导 - 我被困住了。感谢。

2 个答案:

答案 0 :(得分:3)

如果交易者只包含一种交易类型,无论是购买还是,您的逻辑可以归结为保持交易日期,您可以使用{{1} }:

groupby.filter

enter image description here

请注意,使用的数据是字典中提供的数据,与代码块中的数据略有不同。

答案 1 :(得分:1)

似乎你从来没有一个交易者在一天内多次卖出或买入。因此,我们可以过滤等于1的交易数量

df.groupby(['trader_id', 'date']).filter(lambda x: len(x) == 1)

       date trader_id  type
0    1/4/13  Trader_1  Sell
1   13/4/11  Trader_1  Sell
2    4/4/12  Trader_1  Sell
3    3/4/13  Trader_1  Sell
4    2/5/13  Trader_1  Sell
5    9/7/13  Trader_1  Sell
8    5/5/15  Trader_1   Buy
9    5/5/15  Trader_2  Sell
16  29/4/13  Trader_2   Buy
17  30/4/13  Trader_2  Sell
18  22/5/13  Trader_2  Sell
相关问题