2016-01-14 84 views
1

我有下面的代碼,它只是一個函數,它接受一個輸入數據幀並輸出一個版本,將它們按label進行分組並將它們相加。大熊貓想告訴我什麼是警告?

import pandas as pd 
import random 
import numpy as np 

random.seed = 10 

input_data = np.array(
[ 
[random.randint(0,9) for x in range(4)]+['g'], 
[random.randint(0,9) for x in range(4)]+['g'], 
[random.randint(0,9) for x in range(4)]+['a'], 
[random.randint(0,9) for x in range(4)]+['b'], 
[random.randint(0,9) for x in range(4)]+['b'] 
] 
) 

input_df = pd.DataFrame(data=input_data, columns=['A','B', 'C', 'D', 'label']) 

def group_and_sum(input_df): 
    final_df = pd.DataFrame() 
    for gr,subdf in input_df.groupby('label'): 
     new_df = pd.DataFrame() 

     new_df['label'] = [gr] 
     columns = [x for x in input_df.columns if x!='label'] 
     subdf[columns] = subdf[columns].values.astype(float) 
     for col in columns: 
      new_df[col] = [sum(subdf[col].values)] 

     new_df['sum'] = sum([new_df[x].values for x in columns]) 
     final_df = pd.concat([final_df, new_df]) 
    final_df.index = np.array(range(len(final_df))) 
    return final_df 

final_df = group_and_sum(input_df) 

會拋出以下警告:

Warning (from warnings module): 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas-0.17.0-py2.7-macosx-10.6-intel.egg/pandas/core/frame.py", line 2269 
    self.ix._setitem_with_indexer((slice(None), indexer), value) 
SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame 

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 

兩件事情:

1)當我檢查了警告here它似乎並沒有被我有關。警告中提供的鏈接表明我沒有做任何類似chained-indexing的鏈接。

2)當我試圖重現功能之外的錯誤,我不能因爲某些原因:

input_df[['A']]=input_df[['A']].astype(float) 
input_df[['A','B']]=input_df[['A','B']].astype(float) 

...這些都運行完美的罰款。

是否有另一種方法來重現此警告,並適用於此?謝謝。

回答

1

我相信這個警告是因爲你的線subdf[columns] = subdf[columns].values.astype(float)。你從groupby中獲得了subdf,所以subdf是對原始DataFrame某些行的引用。在此片上設置值會導致警告。換句話說,這是因爲如果你沒有鏈接索引:

input_df[rows_that_are_part_of_this_group][columns] = ... 
+0

好了,所以我猜你告訴我的是,不知何故'「subdf」'還是指或點回'input_df'?我想'groupby'對象中有一些細微差別可以做到這一點。 – Candic3

+0

這是我能夠重現警告的唯一方法:'input_df [input_df ['label'] =='g'] ['label'] = input_df ['A']'儘管如此,我仍然不清楚(這是在我的問題中) – Hunle

+0

@Hunle:這不是說它是危險的,比'input_df [['A']] = input_df [['A']]。 「,這只是它有時較慢。另外,如果您有一系列複雜的切片操作,有時它們在分配時可能不會更新原始對象。 – BrenBarn