根据我的给定列表获取行,而无需修改订单或将列表唯一

时间:2015-12-11 21:51:25

标签: python python-2.7 pandas

我有一个df如下所示,我想根据我的列表从'D'列获取行而不更改或唯一列表的顺序。

  A B C D
0 a b 1 1 
1 a b 1 2 
2 a b 1 3 
3 a b 1 4
4 c d 2 5
5 c d 3 6   #df

我的清单

l = [4, 2, 6, 4]  # my list

df.loc[df['D'].isin(l)].to_csv('output.csv', index = False)

当我使用isin()时,结果会更改顺序并且我的结果是唯一的,df.loc[df['D'] == value仅打印最后一行。

  A B C D
3 a b 1 4
1 a b 1 2
5 c d 3 6  
3 a b 1 4  # desired output 

有什么好办法吗?谢谢,

3 个答案:

答案 0 :(得分:2)

没有循环的解决方案,但merge

In [26]: pd.DataFrame({'D':l}).merge(df, how='left')
Out[26]: 
   D  A  B  C
0  4  a  b  1
1  2  a  b  1
2  6  c  d  3
3  4  a  b  1

答案 1 :(得分:1)

你将不得不迭代你的列表,过滤它们的副本,然后将它们连在一起

l = [4, 2, 6, 4] # you shouldn't use list = as list is a builtin

cache = {}

masked_dfs = []
for v in l:
    try:
        filtered_df = cache[v]
    except KeyError:
        filtered_df = df[df['D'] == v]
        cache[v] = filtered_df

    masked_dfs.append(filtered_df)
new_df = pd.concat(masked_dfs)

更新:修改了我的答案以缓存答案,这样您就不必多次搜索重复

答案 2 :(得分:1)

只收集您要查找的值的索引,放入列表然后使用该列表切片数据

import pandas as pd
df = pd.DataFrame({
'C' : [6, 5, 4, 3, 2, 1],
'D' : [1,2,3,4,5,6]
})
l = [4, 2, 6, 4]

i_locs = [ind for elem in l for ind in df[df['D'] == elem].index]
df.loc[i_locs]

结果

   C  D
3  3  4
1  5  2
5  1  6
3  3  4