gpt4 book ai didi

python - 获取每行的倒数第二列不为空

转载 作者:行者123 更新时间:2023-12-05 08:19:52 24 4
gpt4 key购买 nike

我正在尝试获取每行倒数第二个非空列,其中空值可以在任何列中。由于 null 可以在任何地方,这样的解决方案不起作用:Pandas select the second to last column which is also not nan

不理想的解决方案:我能够用下面的代码解决它,但是必须有一种更简洁的方法来编写它。如有任何反馈,我们将不胜感激。

data = [[1, 10, np.nan, np.nan], [2, 15, 13, np.nan], [9, 14, np.nan, np.nan]] 
df = pd.DataFrame(data, columns = ['a', 'b', 'c', 'd'])

df['count_nulls'] = len(df.columns) - df.apply(lambda x: x.count(), axis=1)
df['count_nonnull'] = df.apply(lambda x: x.count(), axis=1)-1
df['new_index'] = np.where(df['count_nonnull']==1, 1,
np.where(df['count_nonnull']==0,0, df['count_nonnull'] - 1))
df['value'] = df.values[np.arange(len(df)), df['new_index']-1]
df

最佳答案

您可以检查 notna 并在 axis=1 上执行反向 cumsum ,然后获取返回 2 的第一列并获得使用 df.lookup 的值:

u = df.notna().iloc[:,::-1].cumsum(axis=1)
df['value'] = df.lookup(df.index,u.eq(2).dot(u.columns+',').str.split(',').str[0])

print(df)

a b c d value
0 1 10 NaN NaN 1
1 2 15 13.0 NaN 15
2 9 14 NaN NaN 9

由于 lookup 已被弃用,因此可以使用以下评论:

u = df.notna().iloc[:,::-1].cumsum(axis=1)
v = u.eq(2).dot(u.columns+',').str.split(',').str[0]
df['value'] = df.stack().loc[pd.MultiIndex.from_arrays((v.index,v))].to_numpy()

其他部分不用apply就可以解决,或者嵌套np.where

df.assign(
count_nulls=df.isna().sum(1),
count_non_null=df.notna().sum(1),
new_index=lambda df: np.select(
[df.count_non_null == 1, df.count_non_null == 0],
[1, 0],
df.count_non_null - 1))

关于python - 获取每行的倒数第二列不为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65770316/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com