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

时间:2019-01-17 20:02:32

标签: python pandas dataframe

我有一个值列表,其中包含我希望为熊猫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

选择列表中的每个元素指示要从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

4 个答案:

答案 0 :(得分:4)

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

df.lookup(df.index, selection)

array([-0.08224 ,  0.084844,  1.51997 , -0.493662,  0.27423 ])

如果您希望数据以熊猫系列的形式出现,

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

0   -0.082240
1    0.084844
2    1.519970
3   -0.493662
4    0.274230

答案 1 :(得分:3)

我只能想到numpy方法

pd.Series(df.values[df.index,df.columns.get_indexer(selection)])
Out[563]: 
0   -0.082240
1    0.084844
2    1.519970
3   -0.493662
4    0.274230
dtype: float64

答案 2 :(得分:2)

使用optional = false

reindex

输出:

df.reindex(selection, axis=1)

然后,使用 A B B A A 0 0.065447 -1.890299 -1.890299 0.065447 0.065447 1 0.389780 0.301049 0.301049 0.389780 0.389780 2 0.484159 -1.311432 -1.311432 0.484159 0.484159 3 -0.209745 -2.233050 -2.233050 -0.209745 -0.209745 4 -0.093495 -1.527827 -1.527827 -0.093495 -0.093495 np.eye

mask

输出:

df.reindex(selection, axis=1).mask(np.eye(5) == 0).stack()

答案 3 :(得分:1)

IIUC,试试这个

df[selection].values.diagonal()

如果您需要的话,您需要以Series的形式填写-

pd.Series(df[selection].values.diagonal())