我想按列表中给定的特定顺序选择行。例如
此数据帧
a=[['car',1],['bike',3],['jewel',2],['tv',5],['phone',6]]
df=pd.DataFrame(a,columns=['items','quantity'])
>>> df
items quantity
0 car 1
1 bike 3
2 jewel 2
3 tv 5
4 phone 6
我想要得到这个订单['tv','car','phone']
的行,也就是说,首先是电视,然后是汽车,然后是电话。我试过这种方法,但它不能维持秩序
arr=['tv','car','phone']
df.loc[df['items'].isin(arr)]
items quantity
0 car 1
3 tv 5
4 phone 6
发布于 2019-06-19 08:52:44
下面是一个使用Index.get_indexer
的非侵入式解决方案,它不需要设置索引:
df.iloc[pd.Index(df['items']).get_indexer(['tv','car','phone'])]
items quantity
3 tv 5
0 car 1
4 phone 6
请注意,如果这将成为常见的事情(我所说的“索引”是指使用列上的列表进行“索引”),您最好将该列转换为索引。如果你对它进行排序,你会得到加分。
df2 = df.set_index('items')
df2.loc[['tv','car','phone']]
quantity
items
tv 5
car 1
phone 6
发布于 2019-06-19 10:05:55
merge
拯救了我们:
(pd.DataFrame({'items':['tv','car','phone']})
.merge(df, on='items')
)
输出:
items quantity
0 tv 5
1 car 1
2 phone 6
发布于 2019-06-19 12:15:54
对于输入df
中存在的所有要选择的项,这里有一个带有searchsorted
的项,它的性能应该很好-
In [43]: sidx = df['items'].argsort()
In [44]: df.iloc[sidx[df['items'].searchsorted(['tv','car','phone'],sorter=sidx)]]
Out[44]:
items quantity
3 tv 5
0 car 1
4 phone 6
https://stackoverflow.com/questions/56658723
复制相似问题