数据帧警告:在python

时间:2017-04-12 10:56:02

标签: python pandas dataframe

从中处理文件 http://portal.amfiindia.com/spages/NAV0.txt
得到如下输出:
31012017,1,1,135765,12,10.8536000,
31012017,1,1,135762,12,10.8543000,
31012017,1,1,135760,12,10.6599000,
31012017,1,1,135759,12,10.6554000,
31012017,1,1,135763,12,10.8536000,
..
..
..

我尝试使用下面的代码,但收到以下警告。

CODE:

import pandas
import numpy as np

#Sample file for NAV0.txt can be downloaded from url: http://portal.amfiindia.com/spages/NAV0.txt
#creating pandas with selected columns
df=pandas.read_table('NAV0.txt',sep=';',usecols=['Date','Scheme Code','Net Asset Value'])

#converting column with name 'Scheme Code' to digit to remove string part
fil_df=df[df['Scheme Code'].apply(lambda x : str(x).isdigit())]

#converting column with name 'Net Asset value' to numberic and set each value with 7 decimal places 
fil_df['Net Asset Value']=pandas.to_numeric(fil_df['Net Asset Value'],errors='coerce')
fil_df['Net Asset Value']=fil_df['Net Asset Value'].map(lambda x: '%2.7f' % x)


#Formating Date column as YYYMMDD
fil_df['Date']=pandas.to_datetime(fil_df['Date']).dt.strftime('%d%m%Y')

#adding extra column in dataframe
fil_df['ser1']=1
fil_df['ser2']=1
fil_df['period']=12
fil_df['lcol']=''
fil_df=fil_df[['Date','ser1','ser2','Scheme Code','period','Net Asset Value','lcol']]

#Converting datafile to csv
fil_df.to_csv('NAV_1.csv',index=False,header=None)
fil_df.dtypes

错误:

  

C:\用户\管理员\应用程序数据\本地\程序\蟒\ python35-32 \ lib中\站点包\ ipykernel__main __ PY:12:   SettingWithCopyWarning:尝试在a的副本上设置值   从DataFrame切片。尝试使用.loc [row_indexer,col_indexer] =   代替值

     

C:\用户\管理员\应用程序数据\本地\程序\ python的\ python35-32 \ LIB \站点包\ ipykernel__main __潘岳:13:   SettingWithCopyWarning:尝试在a的副本上设置值   从DataFrame切片。尝试使用.loc [row_indexer,col_indexer] =   代替值

     

C:\用户\管理员\应用程序数据\本地\程序\ python的\ python35-32 \ LIB \站点包\ ipykernel__main __潘岳:17:   SettingWithCopyWarning:尝试在a的副本上设置值   从DataFrame切片。尝试使用.loc [row_indexer,col_indexer] =   代替值

     

C:\用户\管理员\应用程序数据\本地\程序\ python的\ python35-32 \ LIB \站点包\ ipykernel__main __潘岳:20:   SettingWithCopyWarning:尝试在a的副本上设置值   从DataFrame切片。尝试使用.loc [row_indexer,col_indexer] =   代替值

     

C:\用户\管理员\应用程序数据\本地\程序\ python的\ python35-32 \ LIB \站点包\ ipykernel__main __潘岳:21:   SettingWithCopyWarning:尝试在a的副本上设置值   从DataFrame切片。尝试使用.loc [row_indexer,col_indexer] =   代替值

     

C:\用户\管理员\应用程序数据\本地\程序\ python的\ python35-32 \ LIB \站点包\ ipykernel__main __潘岳:22:   SettingWithCopyWarning:尝试在a的副本上设置值   从DataFrame切片。尝试使用.loc [row_indexer,col_indexer] =   代替值

     

C:\用户\管理员\应用程序数据\本地\程序\ python的\ python35-32 \ LIB \站点包\ ipykernel__main __潘岳:23:   SettingWithCopyWarning:尝试在a的副本上设置值   从DataFrame切片。尝试使用.loc [row_indexer,col_indexer] =   代替值

Csv文件按预期生成但是如何克服此警告? 我试过用过 fil_df.loc[ pandas.to_numeric(fil_df['Net Asset Value'],errors='coerce').map(lambda x: '%2.7f' % x]
但它没有帮助。
帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

如果你知道你的代码在做什么,你可以使用

pd.options.mode.chained_assignment = None  # default='warn'
在您的代码中

禁用此警告。

答案 1 :(得分:0)

我认为您需要添加copy

fil_df=df[df['Scheme Code'].apply(lambda x : str(x).isdigit())].copy()

如果稍后修改fil_df中的值,您会发现修改不会传播回原始数据(df),并且Pandas会发出警告。

答案 2 :(得分:0)

您可以通过2017年对这个answer的编辑向DataFrame添加新列来了解问题的核心。基本上路线是使用.assign('newCol' = enumerableValues )