我有一个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
有什么好办法吗?谢谢,
答案 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