如果我有这样的熊猫数据框:
A B C D E F G
0 1 1 nan nan 1 1 nan
1 1 nan nan nan 1 1 nan
2 1 1 1 nan nan 1 nan
3 1 1 nan nan 1 1 nan
如何获取NaN值之前的最后一个值的索引和最后的整体值的索引?
这样我得到了回报:
(0,B) (0,F) (1,A) (1,F) (2,C) (2楼) (3,B) (3,F)
作为我的索引。
答案 0 :(得分:1)
对于第一个要求,使用
>>> df.isnull().shift(-1,axis=1).fillna(False).idxmax(1)
0 B
1 A
2 C
3 B
第二次,
df.notnull().T[::-1].T.idxmax(1)
0 F
1 F
2 F
3 F
您可以让他们操纵这些系列以获得所需的预期输出。例如,
>>> list(zip(s1.to_dict().items(),
s2.to_dict().items()))
[((0, 'B'), (0, 'F')),
((1, 'A'), (1, 'F')),
((2, 'C'), (2, 'F')),
((3, 'B'), (3, 'F'))]
答案 1 :(得分:0)
让我们在布尔数据帧上使用np.where
,该数据帧指示最后一个非null值,后跟一个NaN。
r, c = np.where((df.isnull().shift(-1, axis=1) & df.notnull()).dropna(axis=1))
list(zip(df.index[r], df.columns[c]))
输出:
[(0, 'B'),
(0, 'F'),
(1, 'A'),
(1, 'F'),
(2, 'C'),
(2, 'F'),
(3, 'B'),
(3, 'F')]
详细信息:
使用此布尔逻辑为要输出的索引创建一个布尔值显示True的数据框。
(df.isnull().shift(-1, axis=1) & df.notnull())
输出:
A B C D E F G
0 False True False False False True NaN
1 True False False False False True NaN
2 False False True False False True NaN
3 False True False False False True NaN
使用dropna
删除G列,然后使用np.where
获取上述数据框中真实位置的索引值。最后,使用df.index和df.columns在np.where返回的位置获取索引标签,然后使用zip
创建元组和list
。