pandas 仅保留最后一个非NAN列中的值,将所有其他值设置为NAN(快速求解)

enyaitl3  于 2023-04-04  发布在  其他
关注(0)|答案(2)|浏览(110)

我想将df转换为df_target,只保留最后一个非nan列的值(分别针对每一行)。另一个值应设置为nan。
下面的代码已经达到了我想要的效果,但是对于大型 Dataframe 来说非常慢。有没有更快的解决方案?

import pandas as pd

data = {
    'A': [1, 2, 3, pd.NA, 5],
    'B': [pd.NA, pd.NA, pd.NA, 4, 5],
    'C': [pd.NA, pd.NA, 3, 4, pd.NA],
}
df = pd.DataFrame(data)

data_target = {
    'A': [1, 2, pd.NA, pd.NA,pd.NA],
    'B': [pd.NA, pd.NA, pd.NA, pd.NA, 5],
    'C': [pd.NA, pd.NA, 3, 4, pd.NA],
}
df_target = pd.DataFrame(data_target)

df_out = df.apply(lambda row: row.where(row.index == row.last_valid_index(), pd.NA), axis=1)

print(df_out.equals(df_target))
sh7euo9m

sh7euo9m1#

执行:

df.where(df.notnull().iloc[:,::-1].cumsum(axis=1).le(1), pd.NA)

其思想是在每行(axis=1)上从右到左(.iloc[:,::-1])计数(cumsum)非NA(notnull),然后将所有具有>=2 NA的内容屏蔽为NA
输出:

A     B     C
0     1  <NA>  <NA>
1     2  <NA>  <NA>
2  <NA>  <NA>     3
3  <NA>  <NA>     4
4  <NA>     5  <NA>
jutyujz0

jutyujz02#

试试看:

df = df.apply(lambda x: x.mask(x.index != x.last_valid_index()), axis=1)
print(df)

图纸:

A    B    C
0  1.0  NaN  NaN
1  2.0  NaN  NaN
2  NaN  NaN  3.0
3  NaN  NaN  4.0
4  NaN  5.0  NaN

相关问题