我想将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))
2条答案
按热度按时间sh7euo9m1#
执行:
其思想是在每行(
axis=1
)上从右到左(.iloc[:,::-1]
)计数(cumsum
)非NA(notnull
),然后将所有具有>=2
NA的内容屏蔽为NA输出:
jutyujz02#
试试看:
图纸: