pandas select 行条件优先顺序
pandas select rows with condition in priority order
我是 pandas 的新手。所以我的数据框看起来像这样:
id car date color
1 2 bmw 2021-05-21 black
2 3 bmw 2021-05-21 yellow
3 4 mercedes 2021-06-21 red
4 5 toyota 2021-11-01 pink
5 6 toyota 2021-09-06 black
6 7 mercedes 2021-07-07 white
我需要优先选择具有最新日期和颜色的唯一“汽车”的行(红色、粉色、黑色、白色、黄色) ,我的意思是,如果按日期排序的数据框中的汽车颜色为红色,则我保存该行,如果汽车没有红色,则我搜索粉红色等。
所以首先 - 按日期排序
其次 - 如果日期重复,我按需要的颜色排序
我按日期排序:
df.sort_values(by="date").drop_duplicates(subset=["car", "color"], keep="last")
看起来像 rn:
id car date color
1 2 bmw 2021-05-21 black
2 3 bmw 2021-05-21 yellow
3 4 mercedes 2021-06-21 red
6 7 mercedes 2021-07-07 white
5 6 toyota 2021-09-06 black
4 5 toyota 2021-11-01 pink
我真正想看到的:
id car date color
2 bmw 2021-05-21 black
5 toyota 2021-11-01 pink
7 mercedes 2021-07-07 white
IIUC,使用pd.Categorical
来定义你的订单,然后sort_values
+ groupby
.
df["color"] = pd.Categorical(
df["color"], categories=["red", "pink", "black", "white", "yellow"], ordered=True
)
df.sort_values(by=["date", "color"], ascending=[0, 1]).groupby(
"car", as_index=0
).first()
car id date color
0 bmw 2 2021-05-21 black
1 mercedes 7 2021-07-07 white
2 toyota 5 2021-11-01 pink
我是 pandas 的新手。所以我的数据框看起来像这样:
id car date color
1 2 bmw 2021-05-21 black
2 3 bmw 2021-05-21 yellow
3 4 mercedes 2021-06-21 red
4 5 toyota 2021-11-01 pink
5 6 toyota 2021-09-06 black
6 7 mercedes 2021-07-07 white
我需要优先选择具有最新日期和颜色的唯一“汽车”的行(红色、粉色、黑色、白色、黄色) ,我的意思是,如果按日期排序的数据框中的汽车颜色为红色,则我保存该行,如果汽车没有红色,则我搜索粉红色等。
所以首先 - 按日期排序 其次 - 如果日期重复,我按需要的颜色排序
我按日期排序:
df.sort_values(by="date").drop_duplicates(subset=["car", "color"], keep="last")
看起来像 rn:
id car date color
1 2 bmw 2021-05-21 black
2 3 bmw 2021-05-21 yellow
3 4 mercedes 2021-06-21 red
6 7 mercedes 2021-07-07 white
5 6 toyota 2021-09-06 black
4 5 toyota 2021-11-01 pink
我真正想看到的:
id car date color
2 bmw 2021-05-21 black
5 toyota 2021-11-01 pink
7 mercedes 2021-07-07 white
IIUC,使用pd.Categorical
来定义你的订单,然后sort_values
+ groupby
.
df["color"] = pd.Categorical(
df["color"], categories=["red", "pink", "black", "white", "yellow"], ordered=True
)
df.sort_values(by=["date", "color"], ascending=[0, 1]).groupby(
"car", as_index=0
).first()
car id date color
0 bmw 2 2021-05-21 black
1 mercedes 7 2021-07-07 white
2 toyota 5 2021-11-01 pink