在我的一个脚本中,我通过列名列表选择数据框的多个列。以下代码有效:
data = df[lst]
只要列表中的所有元素都包含在数据框中,它就可以正常工作。如果情况并非如此,则会返回错误"' ....'不在索引"。
是否有可能仍然选择列名包含在该列表中的所有列,即使列表中的所有元素都不包含在数据框中?
答案 0 :(得分:23)
我认为你需要Index.intersection
:
df = pd.DataFrame({'A':[1,2,3],
'B':[4,5,6],
'C':[7,8,9],
'D':[1,3,5],
'E':[5,3,6],
'F':[7,4,3]})
print (df)
A B C D E F
0 1 4 7 1 5 7
1 2 5 8 3 3 4
2 3 6 9 5 6 3
lst = ['A','R','B']
print (df.columns.intersection(lst))
Index(['A', 'B'], dtype='object')
data = df[df.columns.intersection(lst)]
print (data)
A B
0 1 4
1 2 5
2 3 6
numpy.intersect1d
的另一个解决方案:
data = df[np.intersect1d(df.columns, lst)]
print (data)
A B
0 1 4
1 2 5
2 3 6
答案 1 :(得分:3)
这里一个非常简单的解决方案是使用 filter()
。在您的示例中,只需键入:
df.filter(lst)
它会自动忽略任何缺失的列。有关更多信息,请参阅 documentation for filter。
一般来说,filter
是一种非常灵活且强大的选择特定列的方法。特别是,您可以使用正则表达式。从@jezrael 借用示例数据,您可以键入以下任一内容。
df.filter(regex='A|R|B')
df.filter(regex='[ARB]')
这些都是微不足道的例子,但假设您只想要以这些字母开头的列,那么您可以输入:
df.filter(regex='^[ARB]')
答案 2 :(得分:2)
很少有其他方法,列表理解要快得多
In [1357]: df[df.columns & lst]
Out[1357]:
A B
0 1 4
1 2 5
2 3 6
In [1358]: df[[c for c in df.columns if c in lst]]
Out[1358]:
A B
0 1 4
1 2 5
2 3 6
计时
In [1360]: %timeit [c for c in df.columns if c in lst]
100000 loops, best of 3: 2.54 µs per loop
In [1359]: %timeit df.columns & lst
1000 loops, best of 3: 231 µs per loop
In [1362]: %timeit df.columns.intersection(lst)
1000 loops, best of 3: 236 µs per loop
In [1363]: %timeit np.intersect1d(df.columns, lst)
10000 loops, best of 3: 26.6 µs per loop
详细
In [1365]: df
Out[1365]:
A B C D E F
0 1 4 7 1 5 7
1 2 5 8 3 3 4
2 3 6 9 5 6 3
In [1366]: lst
Out[1366]: ['A', 'R', 'B']
答案 3 :(得分:0)
将*
与列表一起使用
data = df[[*lst]]
它将给出期望的结果。
答案 4 :(得分:0)
请尝试以下操作:
语法:数据框[[列列表]]
例如:df [['a','b']]
a
Out[5]:
a b c
0 1 2 3
1 12 3 44
X是要切片的请求列的列表
x = ['a','b']
这将为您提供需求切片:
a[x]
Out[7]:
a b
0 1 2
1 12 3
性能:
%timeit a[x]
333 µs ± 9.27 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)