使用字典在 pandas 列中填充 NaN
Fill NaNs in pandas columns using dictionary
有没有一种方法可以使用不包含所有列的字典来映射列值。例如:
假设我的数据框是:
A B C D E F
nan nan nan nan nan nan
我有一本字典,我想将其用作映射器:
d = {'A': 1, 'B': 1, 'E': 1}
所以输出应该用 0 替换那些不在字典中的值
A B C D E F
1 1 0 0 1 0
最惯用的选择是两次 fillna
调用,
df.fillna(d).fillna(0, downcast='infer')
df
A B C D E F
0 1 1 0 0 1 0
piRSquared 建议 assign
作为第一个 fillna
调用的替代方案,
df.assign(**d).fillna(0, downcast='infer')
df
A B C D E F
0 1 1 0 0 1 0
另一种选择是在列上使用 Index.isin
。这是单行表格:
df[:] = [df.columns.isin(d.keys()).astype(int)]
要推广到 N 行,我们使用 repeat
:
df[:] = df.columns.isin(d.keys()).astype(int)[None,:].repeat(len(df), axis=0)
df
A B C D E F
0 1 1 0 0 1 0
为了好玩,你也可以使用reindex
:
pd.DataFrame(d, index=df.index).reindex(df.columns, axis=1, fill_value=0)
A B C D E F
0 1 1 0 0 1 0
有没有一种方法可以使用不包含所有列的字典来映射列值。例如:
假设我的数据框是:
A B C D E F
nan nan nan nan nan nan
我有一本字典,我想将其用作映射器:
d = {'A': 1, 'B': 1, 'E': 1}
所以输出应该用 0 替换那些不在字典中的值
A B C D E F
1 1 0 0 1 0
最惯用的选择是两次 fillna
调用,
df.fillna(d).fillna(0, downcast='infer')
df
A B C D E F
0 1 1 0 0 1 0
piRSquared 建议 assign
作为第一个 fillna
调用的替代方案,
df.assign(**d).fillna(0, downcast='infer')
df
A B C D E F
0 1 1 0 0 1 0
另一种选择是在列上使用 Index.isin
。这是单行表格:
df[:] = [df.columns.isin(d.keys()).astype(int)]
要推广到 N 行,我们使用 repeat
:
df[:] = df.columns.isin(d.keys()).astype(int)[None,:].repeat(len(df), axis=0)
df
A B C D E F
0 1 1 0 0 1 0
为了好玩,你也可以使用reindex
:
pd.DataFrame(d, index=df.index).reindex(df.columns, axis=1, fill_value=0)
A B C D E F
0 1 1 0 0 1 0