我正在寻找一种方法,以获取由 ID Date Diff Class
0 010101 11/12/2008 NaN Good
1 010102 02/07/2008 NaN Very Good
2 010102 08/07/2008 6.0 Bad
3 010103 12/02/2009 NaN Very Bad
4 010104 07/05/2007 NaN Very Good
获得的第一行带有条件的子集,让我们来看一个更清楚的示例:
Very Good
由于每个ID属于第一类,因此我正在寻找一种获取以下子集的方法,此处 ID Date Diff Class
010102 02/07/2008 NaN Very Good
010102 08/07/2008 6.0 Bad
010104 07/05/2007 NaN Very Good
首次出现:
import pandas as pd
df = pd.DataFrame(
[
{"ID": 010101, "Date": '11/12/2008', "Class" : "Good"},
{"ID": 010102, "Date": '02/07/2008', "Class" : "Very Good"},
{"ID": 010102, "Date": '08/07/2008', "Diff": 6.0 , "Class" : "Bad"},
{"ID": 010103, "Date": '12/02/2009', "Class" : "Very Bad"},
{"ID": 010104, "Date": '07/05/2007', "Class" : "Very Good"},
],
columns=["ID", "Date", "Diff", "Class"],
)
感谢您的帮助,
app:drawableLeftCompat
答案 0 :(得分:1)
基于注释,似乎您想过滤到该ID的第一个日期为“非常好”的ID。我假设您的数据帧称为df
。
首先,我们应将您的Date
列转换为正确的pandas
日期时间,以确保其正确排序(我假设此处的日期为dd / mm / yyyy):
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
然后,我们用ID
和Date
进行排序,在ID
上分组,并返回得到的第一行(由于排序,该行将是该{ {1}}。
ID
由此,我们可以计算出第一行中的first_entry = df.sort_values(by=['ID', 'Date']).groupby('ID', as_index=False).first()
为Class
,并选择这些ID值:
Very Good
最后,我们可以使用这些ID值来过滤原始数据帧。
vg = first_entry[first_entry['Class'] == 'Very Good']['ID']
这给我们:
matches = df[df['ID'].isin(vg)]