在多条件为true的情况下删除熊猫行

时间:2019-04-26 01:40:41

标签: python pandas

我有一个df,其中有950行。让我们假设列为timestampquantityeventfile。这是df的近似值。我要:

  • 选择eventthis_eventfilethis_file的所有行
  • 如果该行与timestampfile并且my_file匹配的行具有相同的quantity,则删除行。

我该怎么做?真的很挣扎。我不知道该如何管理。

编辑:

示例数据:

timestamp,  event,  quantity,   file
2018-10-17 02:01:00,    slept,  7,  base
2018-10-17 02:01:00,    slept,  7,  temp
2018-10-17 02:01:00,    slept,  9,  base
2018-10-17 02:04:00,    studied,    5,  temp
2018-10-17 02:04:00,    farted, 7,  temp
2018-10-17 02:04:00,    drank,  1,  base
2018-10-17 02:04:00,    exercised,  8,  base
2018-10-17 02:04:00,    slept,  7,  base

因此,例如,我将始终保留与文件base相关的记录。我想保持这种偏见,因为这些记录无法删除。我想从不是file的任何其他base中删除任何记录,例如在这里temp,其中timestampevent与与base相关的任何内容相同(同时带有时间戳)但仅当 quantitybase中的条目相同(在相同的时间戳记下)。

因此,在此示例数据中,我希望代码向下标识第二个条目并将其删除,因为数量7base的其他两个之一相同。

该代码不会从02:04:00删除任何内容,因为不存在具有相同时间戳和event字符串(事件都是唯一的)的行。

1 个答案:

答案 0 :(得分:0)

我认为有很多解决方法。这是我的示例代码供您参考。

import pandas as pd
from pandas.compat import StringIO
from pprint import pprint

text = """
timestamp,event,quantity,file
2018-10-17 02:01:00,slept,7,base
2018-10-17 02:01:00,slept,7,temp
2018-10-17 02:01:00,slept,9,base
2018-10-17 02:04:00,studied,5,temp
2018-10-17 02:04:00,farted,7,temp
2018-10-17 02:04:00,drank,1,base
2018-10-17 02:04:00,exercised,8,base
2018-10-17 02:04:00,slept,7,base
"""

df =pd.read_csv(StringIO(text))
print("original dataframe is")
pprint(df)

qty = 7
my_file = 'temp'
my_event = 'slept'
cols =["event","quantify","file"]
qty_check = grp["quantity"].transform(lambda x: x==qty)
evt_check = grp["event"].transform(lambda x: x==my_event)

file_check = grp["event"].transform(lambda x: x==my_file)
combined_check = evt_check & qty_check & file_check
print("\ndropped dataframe is")   
pprint(df[combined_check])

psl也可以参考pandas groupby / transform部分。 http://pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html#transformation 注意:您可能还会找到过滤器功能。但据我所知,我可以过滤组而不是组中的行