从具有重复列的DF中选择基于列表的行

时间:2015-02-10 06:09:35

标签: python pandas

我有以下数据框:

import pandas as pd
rep = pd.DataFrame.from_items([('Probe', ['x', 'y', 'z']), ('Gene', ['foo', 'bar', 'qux']), ('Probe',['x','y','z']), ("RP",[1.00,2.33,4.5])], orient='columns')

产生:

In [11]: rep
Out[11]:
  Probe Gene Probe    RP
0     x  foo     x  1.00
1     y  bar     y  2.33
2     z  qux     z  4.50

请注意,那里有重复的列。 我想要做的是根据列表选择行:

ls = ["x", "z", "i"]

产生这个:

  Probe Gene Probe    RP
0     x  foo     x  1.00
2     z  qux     z  4.50

请注意,我们希望根据上面的原始DF保留列。

为什么会失败?

In [9]: rep[rep[[0]].isin(ls)]
ValueError: cannot reindex from a duplicate axis

做正确的方法是什么? isin的任何替代方案?

2 个答案:

答案 0 :(得分:1)

你应该在这里使用iloc:

In [11]: rep.iloc[rep.iloc[0].isin(ls).values]
Out[11]:
  Probe Gene Probe   RP
0     x  foo     x  1.0
2     z  qux     z  4.5

这首先创建布尔向量(作为一维数组而不是DataFrame),并且可以将其用作掩码:

In [12]: rep.iloc[0].isin(ls).values
Out[12]: array([ True, False,  True, False], dtype=bool)

答案 1 :(得分:1)

您应该提及问题列表ls是否包含属于固定列的值,例如,Probe。如果是这种情况,那么以下工作。

rep.ix[rep.Probe.isin(ls).ix[:,1]]