在过滤小于浮点数的行时使用SettingWithCopyWarning

时间:2018-08-08 14:47:06

标签: python pandas csv

sencap.csv是一个文件,其中有很多我不需要的列,我只想保留一些列以便开始对其进行过滤以分析信息并绘制一些图形,在这种情况下,这将是一个饼状图,该饼图将根据其能量来源汇总能量数量。除了只要求sum()仅小于9.0 MW的那些行的条件之外,一切都正常。

import pandas as pd
import matplotlib.pyplot as plt

aux = pd.read_csv('sencap.csv')

keep_col = ['subsistema','propietario','razon_social', 'estado',
            'fecha_servicio_central', 'region_nombre', 'comuna_nombre',
            'tipo_final', 'clasificacion', 'tipo_energia', 'potencia_neta_mw',
            'ley_ernc', 'medio_generacion', 'distribuidora', 'punto_conexion',
            ]
c1 = aux['medio_generacion'] == 'PMGD'
c2 = aux['medio_generacion'] == 'PMG'

aux2 = aux[keep_col]
aux3 = aux2[c1 | c2]

for col in ['potencia_neta_mw']:
    aux3[col] = pd.to_numeric(aux3[col].str.replace(',','.'))

c3 = aux3['potencia_neta_mw'] <= 9.0
aux4 = aux3[c3]

df = aux4.groupby(['tipo_final']).sum()

警告:

  

SettingWithCopyWarning:   试图在DataFrame的切片副本上设置一个值。   尝试使用.loc[row_indexer,col_indexer] = value instead

     

请参阅文档中的警告:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

     

aux3[col] = pd.to_numeric(aux3[col].str.replace(',','.'))

1 个答案:

答案 0 :(得分:0)

aux3[col] = pd.to_numeric(aux3[col].str.replace(',','.')) 

此行是您收到警告的原因。

使用索引访问“ col”可能会导致无法预测的行为,因为它可能返回原始数据的视图或副本。

这取决于数组的内存布局,关于哪些熊猫无法保证

pandas文档建议用户改用.loc。

示例:

In: df

Out: 
      one          two       
  first second first second
0     a      b     c      d
1     e      f     g      h
2     i      j     k      l
3     m      n     o      p

dfmi.loc[:,('one','second')] = value
# becomes
dfmi.loc.__setitem__((slice(None), ('one', 'second')), value)

dfmi['one']['second'] = value
# becomes
dfmi.__getitem__('one').__setitem__('second', value)

在第二种情况下__getitem__是不可预测的。它可能返回数据的视图或副本。修改视图和复制的方式有所不同。

在副本上进行更改不会像在视图上所做的那样反映在原始数据上。

注意:因此,警告出现在警告用户,即使您获得了预期的输出,也有可能会导致某些不可预测的行为。