我对Pandas 了解不多,所以我的解决方案可能不是最好的,但我有一个建议:
如果您的ID
列是一个索引,也许您可以利用这样一个事实,即np.NaN
总是被认为是<
(小于),而不是True
甚至False
(某种程度上……NaN
和布尔值之间的布尔比较将始终计算为False
).因此,(False
和NaN
)的max
值将是False
,或者(True
和NaN
)的max
值将是True
.
让我们从一些示例数据开始:
import pandas as pd
import numpy as np
df = pd.DataFrame({
"ID": [123, 123, 345, 345, 678, 678],
"bad_loan": [True, np.NaN, np.NaN, np.NaN, False, np.NaN],
})
df = df.set_index('ID')
按ID
分组,取bad_loan
列中的.max()
列.这将尽可能丢弃NaN
(S):
non_nans = df.groupby('ID')['bad_loan'].agg(np.max)
print(non_nans)
# Outputs:
# ID
# 123 True
# 345 NaN
# 678 False
现在,你只需要告诉Pandas 在你的df中填满NaN
,从你的non_nans
系列中获取值,按公共指数合并,也就是按ID
列:
df = df.fillna({'bad_loan': non_nans})
print(df)
# Outputs:
# ID
# 123 True
# 123 True
# 345 NaN
# 345 NaN
# 678 False
# 678 False