使用列标签列表从 DataFrame 行中选择列

Ste*_*ell 3 python dataframe pandas

我有一个值列表,其中包含我想要的 pandas DataFrame 每一行的列索引。如何将此列标签列表映射到 DataFrame 的每一行?

如果我只是使用列表对 DataFrame 进行索引,整个列表就会应用于每一行,如下所示。

In [10]: df = pd.DataFrame(np.random.randn(5,2), columns=list('AB'))

In [11]: df
Out[11]: 
          A         B
0 -0.082240 -2.182937
1  0.380396  0.084844
2  0.432390  1.519970
3 -0.493662  0.600178
4  0.274230  0.132885

In[12]: selection = list('ABBAA')

In[13]: selection
Out[13]: ['A', 'B', 'B', 'A', 'A']

In[14]: df[selection]
Out[14]:
          A         B         B         A         A
0 -0.082240 -2.182937 -2.182937 -0.082240 -0.082240
1  0.380396  0.084844  0.084844  0.380396  0.380396  
2  0.432390  1.519970  1.519970  0.432390  0.432390
3 -0.493662  0.600178  0.600178 -0.493662 -0.493662
4  0.274230  0.132885  0.132885  0.274230  0.274230
Run Code Online (Sandbox Code Playgroud)

选择列表中的每个元素指示要从 DataFrame 中的相应行中选择的列。在此示例中,我想要A从第一行开始的列,B从第二行和第三行开始,然后A从第四行和第五行开始。可以看出,这是上面结果的对角线。我的实际 DataFrame 要大得多,我认为仅仅为了选择对角线而构建上述结果是没有意义的。

我当然可以通过循环行来实现这一点,但我希望 Pandas 有一个内置的方法来做到这一点。我正在寻找获得以下结果的方法。

In[15]: df <do something> selection
Out[15]:
0 -0.082240
1  0.084844
2  1.519970
3 -0.493662
4  0.274230

Run Code Online (Sandbox Code Playgroud)

Vai*_*ali 5

如果您首先根据选择选择列,然后获取对角线值,则会将数据帧切片两次。您可以改为使用查找,它返回与每个(行,列)对对应的值的数组。

df.lookup(df.index, selection)

array([-0.08224 ,  0.084844,  1.51997 , -0.493662,  0.27423 ])
Run Code Online (Sandbox Code Playgroud)

如果你想要 Pandas 系列形式的数据,

pd.Series(df.lookup(df.index, selection))

0   -0.082240
1    0.084844
2    1.519970
3   -0.493662
4    0.274230
Run Code Online (Sandbox Code Playgroud)

  • 在我的问题中,我声明列表的每一行都有一个值。我正在使用它为 DataFrame 创建一个新列。不需要按选择列表的长度对索引进行切片。`df.lookup(df.index, Selection)` 是一个干净、简单、易于理解的解决方案。谢谢你! (2认同)