【问题标题】:pandas warning when using loc使用 loc 时的熊猫警告
【发布时间】:2018-11-24 04:48:03
【问题描述】:

我有这个代码示例,它应该使用 group-by 将数据帧拆分为较小的数据帧,如果“num”列中的数字是偶数,则修改较小的数据帧:

import pandas as pd

df = pd.DataFrame({
    'id1': [1]*5+[2]*5,
    'num': range(11, 21),
    'x': range(10)

})
print df
for id1, grouped_df in df.groupby('id1'):
    grouped_df.loc[grouped_df['num'] % 2 == 0, 'num'] = 'even'
    print grouped_df

print df

但是,当我运行此代码时,我遇到了警告:

/usr/local/lib/python2.7/dist-packages/pandas/core/indexing.py:537: SettingWithCopyWarning:试图在一个副本上设置一个值 从 DataFrame 切片。尝试使用 .loc[row_indexer,col_indexer] = 取而代之的价值

请参阅文档中的注意事项: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

并且在“真实”数据上运行代码时非常慢。

据我了解,此警告建议使用loc,但我已经在使用它了! pandas 是否将 group-by 返回的数据帧视为切片?我怎样才能摆脱这个警告并确保预期的行为?

【问题讨论】:

  • 警告不一定与您的程序性能有关。警告就是警告,通常是误报。您可以尝试进行基准测试,看看需要花费什么时间。

标签: python pandas group-by


【解决方案1】:

使用copy:

for id1, grouped_df in df.groupby('id1'):
    grouped_df = grouped_df.copy()
    grouped_df.loc[grouped_df['num'] % 2 == 0, 'x'] = 'even'
    print (grouped_df)

   id1  num     x
0    1   11     0
1    1   12  even
2    1   13     2
3    1   14  even
4    1   15     4
   id1  num     x
5    2   16  even
6    2   17     6
7    2   18  even
8    2   19     8
9    2   20  even

【讨论】:

  • 在我的真实代码中,我需要使用分组数据框
  • @MaxSegal - 好的,然后解决方案完全改变了。
猜你喜欢
  • 2017-02-23
  • 2018-09-11
  • 1970-01-01
  • 2021-02-07
  • 2016-09-10
  • 2020-08-20
  • 2019-01-23
  • 2021-12-06
  • 2022-01-26
相关资源
最近更新 更多