我有数据框
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
答案 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
答案 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