如果其他列中的值相同,则向前或向后填充 NA
Fill NAs forwards or backwards if values in other columns are the same
给出这个例子:
import pandas as pd
df = pd.DataFrame({
"date": ["20180724", "20180725", "20180731", "20180723", "20180731"],
"identity": [None, "A123456789", None, None, None],
"hid": [12345, 12345, 12345, 54321, 54321],
"hospital": ["A", "A", "A", "B", "B"],
"result": [70, None, 100, 90, 78]
})
因为前三行的hid
和hospital
相同,所以identity
中的值也应该相同。至于其他两行,它们也有相同的 hid
和 hospital
,但没有提供已知的 identity
,因此 identity
中的值应该仍然缺失。换句话说,期望的输出是:
date identity hid hospital result
0 20180724 A123456789 12345 A 70.0
1 20180725 A123456789 12345 A NaN
2 20180731 A123456789 12345 A 100.0
3 20180723 None 54321 B 90.0
4 20180731 None 54321 B 78.0
我可以像 for hid, hospital in df[["hid", "hospital"]].drop_duplicates().itertuples(index=False)
一样遍历 hid
和 hospital
的所有组合,但我不知道下一步该怎么做。
将groupby
和apply
与ffill
和bfill
结合使用:
df['identity'] = df.groupby(['hid', 'hospital'])['identity'].apply(lambda x: x.ffill().bfill())
这将向前 和 向后填充 NaN,同时分隔指定组的值。
给出这个例子:
import pandas as pd
df = pd.DataFrame({
"date": ["20180724", "20180725", "20180731", "20180723", "20180731"],
"identity": [None, "A123456789", None, None, None],
"hid": [12345, 12345, 12345, 54321, 54321],
"hospital": ["A", "A", "A", "B", "B"],
"result": [70, None, 100, 90, 78]
})
因为前三行的hid
和hospital
相同,所以identity
中的值也应该相同。至于其他两行,它们也有相同的 hid
和 hospital
,但没有提供已知的 identity
,因此 identity
中的值应该仍然缺失。换句话说,期望的输出是:
date identity hid hospital result
0 20180724 A123456789 12345 A 70.0
1 20180725 A123456789 12345 A NaN
2 20180731 A123456789 12345 A 100.0
3 20180723 None 54321 B 90.0
4 20180731 None 54321 B 78.0
我可以像 for hid, hospital in df[["hid", "hospital"]].drop_duplicates().itertuples(index=False)
一样遍历 hid
和 hospital
的所有组合,但我不知道下一步该怎么做。
将groupby
和apply
与ffill
和bfill
结合使用:
df['identity'] = df.groupby(['hid', 'hospital'])['identity'].apply(lambda x: x.ffill().bfill())
这将向前 和 向后填充 NaN,同时分隔指定组的值。