如何在 pandas 中获取每行的第二个非空值
How to get second non null value per row in pandas
如何在 pandas 中获取每行的第二个非空值。我知道使用 first_valid_index() 我们可以获得每行的第一个非空值,但是如何获得第二个非空值。
有帮助吗?
您可以使用df.notna()
with cumsum
and idxmax
另外,为了处理列中没有 NaN
值的情况,请使用 series.where
和相同的解决方案,但条件是检查空值的总和
df.notna().cumsum().eq(2).idxmax().where(df.isna().sum().gt(1))
示例:
data = {'id': [np.nan,1,1,np.nan,2,3],
'value': ['a','a',np.nan,np.nan,'b','c'],
'obj_id': [np.nan,2,3,3,3,np.nan],
'test': [1,2,3,4,5,6]}
df = pd.DataFrame (data)
id value obj_id test
0 NaN a NaN 1
1 1.0 a 2.0 2
2 1.0 NaN 3.0 3
3 NaN NaN 3.0 4
4 2.0 b 3.0 5
5 3.0 c NaN 6
对于列级别检查:
df.notna().cumsum().eq(2).idxmax().where(df.notna().sum().gt(1))
id 2
value 1
obj_id 2
test 1
dtype: float64
对于 rowlevel ,您可以使用相同的逻辑,但 axis=1:
df.notna().cumsum(1).eq(2).idxmax(1).where(df.notna().sum(1).gt(1))
0 test
1 value
2 obj_id
3 test
4 value
5 value
dtype: object
如何在 pandas 中获取每行的第二个非空值。我知道使用 first_valid_index() 我们可以获得每行的第一个非空值,但是如何获得第二个非空值。 有帮助吗?
您可以使用df.notna()
with cumsum
and idxmax
另外,为了处理列中没有 NaN
值的情况,请使用 series.where
和相同的解决方案,但条件是检查空值的总和
df.notna().cumsum().eq(2).idxmax().where(df.isna().sum().gt(1))
示例:
data = {'id': [np.nan,1,1,np.nan,2,3],
'value': ['a','a',np.nan,np.nan,'b','c'],
'obj_id': [np.nan,2,3,3,3,np.nan],
'test': [1,2,3,4,5,6]}
df = pd.DataFrame (data)
id value obj_id test
0 NaN a NaN 1
1 1.0 a 2.0 2
2 1.0 NaN 3.0 3
3 NaN NaN 3.0 4
4 2.0 b 3.0 5
5 3.0 c NaN 6
对于列级别检查:
df.notna().cumsum().eq(2).idxmax().where(df.notna().sum().gt(1))
id 2
value 1
obj_id 2
test 1
dtype: float64
对于 rowlevel ,您可以使用相同的逻辑,但 axis=1:
df.notna().cumsum(1).eq(2).idxmax(1).where(df.notna().sum(1).gt(1))
0 test
1 value
2 obj_id
3 test
4 value
5 value
dtype: object