Python 从列表中按列表顺序选择数据帧的行

Python 从列表中按列表顺序选择数据帧的行,python,pandas,dataframe,Python,Pandas,Dataframe,该问题最初是作为评论提出的,但由于该问题被标记为重复问题,因此无法得到正确答案 对于给定的pandas.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 如何根据列中的值从列表中选择行(例如,'a') 比如说 # from list_of_values = [3,4,6] # we would

该问题最初是作为评论提出的,但由于该问题被标记为重复问题,因此无法得到正确答案

对于给定的
pandas.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
如何根据列中的值从列表中选择行(例如,
'a'

比如说

# from
list_of_values = [3,4,6]

# we would like, as a result
#      A   B
# 2    3   3
# 3    4   5
# 1    6   2
如前所述使用
isin
是不令人满意的,因为它不能保持
'A'
值输入列表中的顺序


如何实现上述目标?

克服这一问题的一种方法是将
'A'
列作为
索引
,并在新生成的
pandas.DataFrame
上使用
loc
。最终,可以重置子采样数据帧的索引

以下是如何:

ret = df.set_index('A').loc[list_of_values].reset_index(inplace=False)

# ret is
#      A   B
# 0    3   3
# 1    4   5
# 2    6   2 
请注意,此方法的缺点是,原始索引已在该过程中丢失


有关熊猫索引的详细信息:

1]值列表的通用方法

In [936]: dff = df[df.A.isin(list_of_values)]

In [937]: dff.reindex(dff.A.map({x: i for i, x in enumerate(list_of_values)}).sort_values().index)
Out[937]:
   A  B
2  3  3
3  4  5
1  6  2
2]如果排序了
值列表
。你可以用

In [926]: df[df.A.isin(list_of_values)].sort_values(by='A')
Out[926]:
   A  B
2  3  3
3  4  5
1  6  2
与列表创建的helper
DataFrame
一起使用,并与匹配列的列名一起使用:

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

list_of_values = [3,6,4]
df1 = pd.DataFrame({'A':list_of_values}).merge(df)
print (df1)
   A  B
0  3  3
1  6  2
2  4  5
对于更一般的解决方案:

df = pd.DataFrame({'A' : [5,6,5,3,4,4,6,5], 'B':range(8)})
print (df)
   A  B
0  5  0
1  6  1
2  5  2
3  3  3
4  4  4
5  4  5
6  6  6
7  5  7

list_of_values = [6,4,3,7,7,4]


原始索引在此过程中丢失。@零-然后是必需的
df1=pd.DataFrame({'A':list\u of\u values})、merge(df.reset\u index()).set\u index('index')。rename\u axis(None)
实际上,我发现这种方法在
list\u of\u values
包含重复值的情况下不起作用:顺序不能保证保持。很抱歉,我不得不取消通知answer@syltruong-我尝试为重复值
(4)
和不匹配值
(7)
创建更通用的解决方案。有一个问题-
列表的所有值都在列中?是否有可能
列出\u值=[3,4,6,7,7,4]
?实际上没有,但该解决方案确实存在不处理列外值的不便。最好的解决方案是不删除原始索引、处理重复值的最通用解决方案?
#create df from list 
list_df = pd.DataFrame({'A':list_of_values})
print (list_df)
   A
0  6
1  4
2  3
3  7
4  7
5  4

#column for original index values
df1 = df.reset_index()
#helper column for count duplicates values
df1['g'] = df1.groupby('A').cumcount()
list_df['g'] = list_df.groupby('A').cumcount()

#merge together, create index from column and remove g column
df = list_df.merge(df1).set_index('index').rename_axis(None).drop('g', axis=1)
print (df)
   A  B
1  6  1
4  4  4
3  3  3
5  4  5