假设我有一个如下所示的 csv+-----+-----------+---------+| ID | state | city |+-----+-----------+---------+| 101 | READY | || 101 | DELIVERED | NEWYORK || 101 | DELIVERED | LONDON | | 102 | READY | || 102 | DELIVERED | LONDON || 103 | READY | || 103 | DELIVERED | NEWYORK || 104 | READY | || 104 | DELIVERED | TOKYO || 104 | DELIVERED | PARIS || 105 | DELIVERED | NEWYORK |+-----+-----------+---------+现在我想要带有 State 的 ID,READY它有DELIVEREDas NEWYORK。相同的 ID 会在不同的州和城市出现多次。总是READYcity为空cityDELIVERED总是有一些值。city所以首先我想检查DELIVERED列的值state。如果是 NEWYORK,则取该 ID 的 READY 行。如果没有对应READY的行,那么我们可以忽略(本例中的 ID 105)预期产出+-----+-----------+---------+| ID | state | city |+-----+-----------+---------+| 101 | READY | || 103 | READY | |+-----+-----------+---------+我试过在熊猫中使用自我加入。但是我不知道如何继续,因为我是 python 的新手。目前我正在用 SQL 做这件事。import pandas as pdmydata = pd.read_csv('C:/Mypython/Newyork',encoding = "ISO-8859-1")NY = pd.merge(mydata,mydata,left_on='ID',right_on='ID',how='inner')
2 回答
拉风的咖菲猫
TA贡献1995条经验 获得超2个赞
让我们尝试用布尔索引来groupby().transform()识别那些:NEWYORK
has_NY = df['city'].eq('NEWYORK').groupby(df['ID']).transform('any')
mask = df['state'].eq('READY') & has_NY
df[mask]
输出:
ID state city
0 101 READY None
5 103 READY None
慕工程0101907
TA贡献1887条经验 获得超5个赞
使用NEWYORK条件获取 ID 列表,然后使用该列表进行过滤。
new_york_ids = df.loc[df['city']=='NEWYORK', 'ID']
df[(df['state']=='READY') & (df['ID'].isin(new_york_ids))]
ID state city
0 101 READY None
5 103 READY None
添加回答
举报
0/150
提交
取消