【问题标题】:Re-Assigning values on a pandas DataFrame best practice在 pandas DataFrame 最佳实践上重新分配值
【发布时间】:2022-01-26 16:11:04
【问题描述】:

我正在处理 Medical Data Visualizer 挑战,我正在根据某些条件重新分配 DataFrame 值,如下所示:

df['cholesterol'].loc[df['cholesterol'] == 1] = 0 #normalizing cholestrol values
df['cholesterol'].loc[df['cholesterol'] > 1] = 1 #normalizing cholestrol values

它似乎有效,但是,我也在使用 Jupyter Notebooks,当我使用此代码加载片段时,我收到以下警告:

/usr/local/lib/python3.7/dist-packages/pandas/core/indexing.py:670: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

现在,即使它有效,我想知道这是否是最好的方法(最佳实践)或者我应该重新分配这些值的其他方法。

寻找关于此主题的最佳做法,以免导致未来出现错误。

谢谢

编辑:

id  age gender  height  weight  ap_hi   ap_lo   cholesterol gluc    smoke   alco    active  cardio
    0   18393   2   168 62.0    110 80  1   1   0   0   1   0
    1   20228   1   156 85.0    140 90  3   1   0   0   1   1
    2   18857   1   165 64.0    130 70  3   1   0   0   0   1
    3   17623   2   169 82.0    150 100 1   1   0   0   1   1
    4   17474   1   156 56.0    100 60  1   1   0   0   0   0

【问题讨论】:

  • 但我的目标不是创建副本,只是更改满足这些条件的原始数据框单元格。

标签: python pandas dataframe


【解决方案1】:

参考:Why does assignment fail when using chained indexing?

用途:

#        subset index          subset columns
df.loc[df['cholesterol'] == 1, 'cholesterol'] = 0
df.loc[df['cholesterol'] > 1, 'cholesterol'] = 1
print(df)

# Output
   cholesterol
0            0
1            1
2            1

这将避免SettingWithCopyWarning,因为没有链式子集。

设置:

df = pd.DataFrame({'cholesterol': [1, 2, 3]})
print(df)

# Output
   cholesterol
0            1
1            2
2            3

更新

使用您的样品:

>>> df[['id', 'age', 'cholesterol']]
   id    age  cholesterol
0   0  18393            0
1   1  20228            1
2   2  18857            1
3   3  17623            0
4   4  17474            0

>>> df
   id    age  gender  height  weight  ap_hi  ap_lo  cholesterol  gluc  smoke  alco  active  cardio
0   0  18393       2     168    62.0    110     80            0     1      0     0       1       0
1   1  20228       1     156    85.0    140     90            1     1      0     0       1       1
2   2  18857       1     165    64.0    130     70            1     1      0     0       0       1
3   3  17623       2     169    82.0    150    100            0     1      0     0       1       1
4   4  17474       1     156    56.0    100     60            0     1      0     0       0       0

【讨论】:

  • @思茅。它解决了你的问题吗?
  • 我试过这个,但由于某种原因它改变了所有列的值。就像,它不仅仅改变满足条件的值。我正在从 CSV 文件 btw 创建 DF
  • 您忘记了df.loc[df['cholesterol'] == 1, 'cholesterol'] 中的第二个cholesterol(列)
  • 发现了问题,我相信我错过了 df.loc[df['gluc'] == 1] 上的第二个参数,并且不知何故改变了整个 DF。
  • loc 的第一个参数是对行进行子集化,而不是第二个是对列进行子集化。 (如 x,y)
猜你喜欢
  • 2019-06-03
  • 2021-05-01
  • 2013-02-12
  • 2021-08-13
  • 2016-05-28
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多