首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Pandas使用条件填充空值的最佳方法?

使用Pandas使用条件填充空值的最佳方法?
EN

Stack Overflow用户
提问于 2020-12-27 21:38:39
回答 3查看 3.5K关注 0票数 1

例如,我有一个数据如下所示:

代码语言:javascript
运行
复制
df = pd.DataFrame([[np.NaN, '1-5'], [np.NaN, '26-100'], ['Yes', 'More than 1000'], ['No', '26-100'], ['Yes', '1-5']], columns=['self_employed', 'no_employees'])
df

    self_employed   no_employees
0   nan                  1-5
1   nan                 26-100
2   Yes            More than 1000
3   No                  26-100
4   Yes                  1-5

我试图根据以下条件填充空值:

代码语言:javascript
运行
复制
If no_employees is '1-6' then 'Yes', otherwise 'No'

我能够使用字典完成这一工作,例如:

代码语言:javascript
运行
复制
self_employed_dict = {'1-5': 'Yes', '6-25': 'No', '26-100': 'No', '100-500': 'No', 'More than 1000':'No', '500-1000': 'No'}
df['self_employed'] = df['self_employed'].fillna(df['no_employees'].map(self_employed_dict))

但我想知道是否有一种更好、更简单的方法来做到这一点。在这个例子中,我不得不为自己编写字典来映射它,那么我如何才能聪明地做到这一点呢?

预期的输出如下所示:

代码语言:javascript
运行
复制
    self_employed   no_employees
0   Yes                  1-5
1   No                 26-100
2   Yes            More than 1000
3   No                  26-100
4   Yes                  1-5
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-12-27 22:08:18

使用填充物是正确的方法,但是您可以这样做:

代码语言:javascript
运行
复制
values = df['no_employees'].eq('1-5').map({False: 'No', True: 'Yes'})
df['self_employed'] = df['self_employed'].fillna(values)
print(df)

输出

代码语言:javascript
运行
复制
  self_employed    no_employees
0           Yes             1-5
1            No          26-100
2           Yes  More than 1000
3            No          26-100
4           Yes             1-5
票数 3
EN

Stack Overflow用户

发布于 2020-12-27 22:44:37

答案取决于你的熊猫版本。有两种情况:

  1. 熊猫标准1.0.0+,检查 print(df['self_employed'].isna()).any()将返回False 和/或 type(df.iloc[0,0])返回str类型。 在这种情况下,您的dataframe的所有元素都是string类型的,fillna()将无法工作。这是因为fillna()函数不会对字符串nan作出反应,因此可以使用update()
代码语言:javascript
运行
复制
helper = df['no_employees'].eq('1-5').map({False: 'No', True: 'Yes'}).to_frame('self_employed')
df.update(other=helper, filter_func=lambda x: df['self_employed'].eq('nan'))
  1. 旧的Pandas版本中的数据类型可以混在一起,这意味着 print(df['self_employed'].isna()).any()将返回True 和/或 type(df.iloc[0,0])返回类型float
代码语言:javascript
运行
复制
values = df['no_employees'].eq('1-5').map({False: 'No', True: 'Yes'})
df['self_employed'] = df['self_employed'].fillna(values)

这会让你:

代码语言:javascript
运行
复制
  self_employed    no_employees
0           Yes             1-5
1            No          26-100
2           Yes  More than 1000
3            No          26-100
4           Yes             1-5
票数 1
EN

Stack Overflow用户

发布于 2020-12-27 22:09:34

你可以用:

代码语言:javascript
运行
复制
pd.fillna(0)

它用所需的值填充NA/NaN值(在本例中为0)。

请参阅这里的更多细节。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65470708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档