【问题标题】:Problem with changing NaN values to 0 in a column of a pandas dataframe在 pandas 数据框的列中将 NaN 值更改为 0 的问题
【发布时间】:2020-10-22 00:43:20
【问题描述】:

我正在尝试了解这是如何工作的..

我有这个 df。

   ticket_id                      address grafitti_status
0     284932  10041 roseberry, Detroit MI             NaN
1     285362  18520 evergreen, Detroit MI             NaN
2     285361  18520 evergreen, Detroit MI             NaN
3     285338     1835 central, Detroit MI             NaN
4     285346     1700 central, Detroit MI             NaN
5     285345     1700 central, Detroit MI             NaN


在哪里

In: df.grafitti_status.unique()
Out: array([nan, 'GRAFFITI TICKET'], dtype=object)

所以我正在尝试将 NaN 更改为 0 并将 'GRAFFITI TICKET' 更改为 1。

我用过

df.loc[df['grafitti_status'] == 'GRAFFITI TICKET', 'grafitti_status'] = 1

效果很好,但对于 '0' 也一样

df.loc[df['grafitti_status'] == np.nan, 'grafitti_status'] = 0

Out: array([nan, 1], dtype=object)

不起作用,因为 NaN 值仍然存在..

df['grafitti_status'] = df['grafitti_status'].replace({np.nan:0,'GRAFFITI TICKET':1},inplace=True)

也不起作用,用 None 替换所有内容。

    ticket_id   address grafitti_status
0   284932  10041 roseberry, Detroit MI None
1   285362  18520 evergreen, Detroit MI None
2   285361  18520 evergreen, Detroit MI None
3   285338  1835 central, Detroit MI    None
4   285346  1700 central, Detroit MI    None
5   285345  1700 central, Detroit MI    None
6   285347  1700 central, Detroit MI    None

谁能告诉我为什么它会这样工作?

我终于发现我可以通过

df.loc[df['grafitti_status'] == 'GRAFFITI TICKET', 'grafitti_status'] = 1
df['grafitti_status'] = df['grafitti_status'].fillna(0)

Out: array([0, 1], dtype=int64)

这会导致以下警告消息。

C:\Users\Maria\Anaconda3\lib\site-packages\pandas\core\indexing.py:543: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self.obj[item] = s
C:\Users\Maria\Anaconda3\lib\site-packages\ipykernel_launcher.py:3: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

所以我仍然不确定正确的方法是什么?

【问题讨论】:

    标签: python pandas dataframe replace nan


    【解决方案1】:

    自从

    np.nan==np.nan 将返回 False

    我们有函数isna

    df.loc[df['grafitti_status'].isna(), 'grafitti_status'] = 0
    

    【讨论】:

    • 谢谢!它确实有效。但是,它仍然给我一条警告消息:试图在 DataFrame 的切片副本上设置一个值。尝试改用 .loc[row_indexer,col_indexer] = value 查看文档中的警告:pandas.pydata.org/pandas-docs/stable/… self.obj[item] = s
    • @bluetail 你的 df 是其他 df 的子代,当我们做子集时,我们应该添加 copy df=wholeddf[condition].copy()
    猜你喜欢
    • 2023-01-10
    • 2021-06-19
    • 2016-12-01
    • 1970-01-01
    • 2021-08-26
    • 2021-09-07
    • 2021-03-13
    • 2022-12-09
    • 2021-01-06
    相关资源
    最近更新 更多