我有一个df
,其中有950行。让我们假设列为timestamp
,quantity
,event
,file
。这是df
的近似值。我要:
event
为this_event
和file
为this_file
的所有行timestamp
是file
并且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
,其中timestamp
和event
与与base
相关的任何内容相同(同时带有时间戳)但仅当 quantity
与base
中的条目相同(在相同的时间戳记下)。
因此,在此示例数据中,我希望代码向下标识第二个条目并将其删除,因为数量7
与base
的其他两个之一相同。
该代码不会从02:04:00删除任何内容,因为不存在具有相同时间戳和event
字符串(事件都是唯一的)的行。
答案 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 注意:您可能还会找到过滤器功能。但据我所知,我可以过滤组而不是组中的行