我有以下数据框:
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的最后一列。 如果没有,则返回任何合理的值。 我怎么能这样做?
答案 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,则返回第一个。我们想要最后一个,所以我们垂直翻转数据帧。
最后,如果value
和col=="E"
,我们必须将获得的系列替换为value==False
。您无法对系列的索引应用条件,这就是您首先需要reset_index
的原因。
使用df.replace({'E': {False: value})
可以更优雅地完成最后一步,它会替换“E&C”列中的False
。与value
,但不知何故,它对我不起作用。