Pandas'isin'具有输入保持顺序的输入列表

时间:2014-05-01 18:35:02

标签: python pandas numpy dataframe

我有数据框

df = DataFrame({'A': [5, 6, 3, 4], 'B': [1, 2, 3, 5]})
df

   A  B
0  5  1
1  6  2
2  3  3
3  4  5

我可以用

df[df['A'].isin([3, 6])]

以选择具有传递值的行。

还有办法保持输入列表的顺序吗?

所以我的输出不是:

   A  B
1  6  2
2  3  3

   A  B
1  3  3
2  6  2

5 个答案:

答案 0 :(得分:2)

这有点长,但它确实有效。 isin(),然后基于列表sort_values()。

df = pandas.DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3,5]})
mylist = [3,6]
ndf =  df[df['A'].isin(mylist)]
ndf['sort_cat'] = pandas.Categorical(ndf['A'], categories=mylist, ordered=True)
ndf.sort_values('sort_cat', inplace=True)
ndf.reset_index(inplace=True)
print ndf
   A  B sort_cat
2  3  3        3
1  6  2        6

(我的答案基于sort pandas dataframe based on list

答案 1 :(得分:2)

另一种过滤和排序的选项

import pandas as pd
from functools import reduce
reduce(pd.DataFrame.append, map(lambda i: df[df.A == i], [3, 6]))

答案 2 :(得分:1)

您可以使输入列表成为数据框并使用合并功能。我发现这对于顺序比较重要的大型输入列表特别有用。

例如:

df = pd.DataFrame({'A': [5, 6, 3, 4], 'B': [1, 2, 3, 5]})
input = pd.DataFrame({'input': [3, 6]})
output = input.merge(df, left_on='z', right_on='A').loc[:, ['A', 'B']]
print(output)

   A  B
0  3  3
1  6  2

有2个警告。首先,您必须使用合并功能的'right_on'输入来指定要搜索匹配项的df列。其次,重新生成结果输出数据帧的索引。

答案 3 :(得分:0)

isin是一个设置操作,并且pandas对齐输入,因此输入集的顺序通常与参考帧的顺序相同

如果你真的想这样做,你可以这样做:

In [15]: df.take(df['A'][df['A'].isin([3,6])].order().index)
Out[15]: 
   A  B
2  3  3
1  6  2

[2 rows x 2 columns]

答案 4 :(得分:0)

这个问题有点老了,但我偶然发现必须这样做。这就是我解决问题的方式。我认为这是一个尚未在此处提出的通用且简单的解决方案,并且实际上并未使用isin()方法:

df.set_index('A').loc[[3,6]].reset_index()

提供示例:

>>> df = pd.DataFrame({'A': [5, 6, 3, 4], 'B': [1, 2, 3, 5]})
>>> df.set_index('A').loc[[3,6]].reset_index()
   A  B
0  3  3
1  6  2

当然,这样做的缺点是丢失了原始索引。要保留索引,您还可以:

>>> df.reset_index().set_index('A').loc[[3,6]].reset_index().set_index('index')
       A  B
index      
2      3  3
1      6  2