如何通过数据帧值在python pandas中选择列名?

时间:2014-11-13 20:31:34

标签: python select pandas

我有以下数据框:

pandas.DataFrame(numpy.random.randn(10, 5) > 1, index=range(1, 11), columns=list('ABCDE'))

        A      B      C      D      E
1   False  False  False  False  False
2   False  False  False  False  False
3    True   True  False   True  False
4   False  False   True   True  False
5   False  False  False  False  False
6   False  False  False  False  False
7   False  False  False  False  False
8   False  False  False  False  False
9   False  False  False  False  False
10  False   True  False   True  False

对于每一行,我想获得列名称,该列名称是该行中包含True的最后一列。 如果没有,则返回任何合理的值。 我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

首先设置示例数据:

np.random.seed(1)
df = pd.DataFrame( (randn(10, 5) > 1) , index=range(1, 11), columns=['A','B','C','D','E'])
df

看起来像:

        A      B      C      D      E
1    True  False  False  False  False
2   False   True  False  False  False
3    True  False  False  False   True
4   False  False  False  False  False
5   False   True  False  False  False
6   False  False  False  False  False
7   False  False  False  False  False
8   False  False  False   True  False
9   False  False  False   True  False
10  False  False   True  False  False

听起来你想要做的就是获得每个真值的索引#,然后选择最大索引#。在单个列上,可能如下所示:

df['A'][df['A']].index.max()

返回3.要对所有列执行此操作,最简单的方法是遍历每一列并将结果推送到列表中:

mylist = []
for col in df.columns:
    myval = df[col][df[col]].index.max()
    mylist.append(myval)

mylist

返回:

[3, 5, 10, 9, 3]

如果列中没有True值,则上面的循环逻辑返回nan。

答案 1 :(得分:0)

一个班轮:

>>> value = np.nan
>>> df.reindex_axis(df.columns[::-1], axis=1)\  # flip vertically
      .idxmax(axis=1)\                          # find last(now first) True value 
      .reset_index()\                           # get index for the next step
      .apply(lambda x: value if (x[0]==df.columns[-1] and not df.ix[x['index'], x[0]]) 
                         else x[0], axis=1)     # =value if col=="E" and value==False
Out [1]:
0    NaN
1    NaN
2      D
3      D
4    NaN
5    NaN
6    NaN
7    NaN
8    NaN
9      D

<强>解释

idxmax返回一行中最大值的索引,如果有多个max,则返回第一个。我们想要最后一个,所以我们垂直翻转数据帧。

最后,如果valuecol=="E",我们必须将获得的系列替换为value==False。您无法对系列的索引应用条件,这就是您首先需要reset_index的原因。

使用df.replace({'E': {False: value})可以更优雅地完成最后一步,它会替换“E&C”列中的False。与value,但不知何故,它对我不起作用。