pandas 从列表或其他可迭代对象中按顺序选择行

bnl4lu3b  于 2022-12-16  发布在  其他
关注(0)|答案(2)|浏览(94)

我有一个 Dataframe ,其中包含名为“ID”的列我还有另一个 Dataframe ,其中包含我想要使用的ID值列表。我可以选择一个子 Dataframe ,其中包含与列表中的ID对应的行
例如

IDlist_df=pd.DataFrame({"v":[3,4,6,9]})
df=pd.DataFrame({"ID":[1,1,2,3,3,4,4,4,5,6,6,7,8,9],"name":['menelaus','helen','ulyses','paris','hector', 'priamus','hecuba','andromache','achiles','ascanius','eneas','ajax','nestor','helenus']})

selected_lines=df[df['ID'].isin(IDlist_df['v'])]
print(selected_lines)

有了这个我就能

ID        name
3    3       paris
4    3      hector
5    4     priamus
6    4      hecuba
7    4  andromache
9    6    ascanius
10   6       eneas
13   9     helenus

我得到了一个子 Dataframe ,其中包含ID为3、4、6、9的行
到目前为止一切顺利。
但是如果我想维持秩序

IDlist_df=pd.DataFrame({"v":[3,9,6,4]})

我得到了和上面一样的结果。
我怎样才能得到

ID        name
3    3       paris
4    3      hector
13   9     helenus
9    6    ascanius
10   6       eneas
5    4     priamus
6    4      hecuba
7    4  andromache

(You可以看到顺序3、9、6、4保持不变)

zpf6vheq

zpf6vheq1#

如果IDlist_df.v列中的值是唯一的,则可以将renameDataFrame.merge一起使用:

df = IDlist_df.rename(columns={'v':'ID'}).merge(df, on='ID')
print (df)
   ID        name
0   3       paris
1   3      hector
2   9     helenus
3   6    ascanius
4   6       eneas
5   4     priamus
6   4      hecuba
7   4  andromache
ssm49v7z

ssm49v7z2#

找到保存索引的方法

(selected_lines.reset_index().set_index('ID').loc[[3, 9, 6, 4]]
 .reset_index().set_index('index').rename_axis(''))

结果:

ID  name
3   3   paris
4   3   hector
13  9   helenus
9   6   ascanius
10  6   eneas
5   4   priamus
6   4   hecuba
7   4   andromache

其他方式

按类别排序值

lst = [3, 9, 6, 4]
selected_lines.sort_values('ID', key=lambda x: pd.Categorical(x, categories=lst, ordered=True))

相关问题