我有一个熊猫数据框,我想用'colname_miss'字符串填充缺失的类别。
def FillCatMissing(df):
cols = ['A','B','C']
df[cols] = df[cols].fillna('miss')
return df
这会用字符串'miss'填充所有丢失的类别,我需要像A列一样是'A_miss',B列一样像'B_miss'。...
答案 0 :(得分:2)
for col in df.columns:
df[col].fillna(col+'_miss', inplace=True)
答案 1 :(得分:1)
为什么不apply
和replace
:
def FillCatMissing(df):
cols = ['A','B','C']
df[cols] = df[cols].apply(lambda x: x.replace(np.nan, x.name + '_miss'))
return df
答案 2 :(得分:1)
df = pd.DataFrame(dict(A=['a', None], B=[None, 'b'], C=[None, None]))
df
A B C
0 a None None
1 None b None
dict
传递到fillna
熊猫有一种处理此问题的特定方法。您可以将字典传递给fillna
方法,该方法定义用于替换每列的空值的方法,而不是遍历各列并分别填充每一列。换句话说,这就是应该做的方式。
在这种情况下,您希望字典的键与要填充的列名匹配。
df.fillna({k: f'{k}_miss' for k in df}) # This is the answer you are looking for
A B C
0 a B_miss C_miss
1 A_miss b C_miss
我们可以只将其保留在列'A'
和'B'
df.fillna({k: f'{k}_miss' for k in ['A', 'B']})
A B C
0 a B_miss None
1 A_miss b None
这将单独保留列'C'
。
最后,这将生成一个带有结果的副本,而不是对现有数据框进行突变。如果要覆盖现有数据框,则只需分配相同的名称
df = df.fillna({k: f'{k}_miss' for k in df})
尽管我显然更喜欢其他答案,但这是另一种解决方法。
df.fillna(df.columns.to_series().add('_miss'))
A B C
0 a B_miss C_miss
1 A_miss b C_miss