2015-11-12 19 views
0

我有一個df需要基於用戶輸入的值。這將成爲每次運行不同數據的程序的一部分。我遇到的代碼是熊貓集團通過拆分,獲取用戶輸入,將列添加到子集,合併回df

for A, new_df in data.groupby(level=0): 
    print A 
    tariff=get_tariff() 
    this=data.iloc[data.index.get_level_values('A') == A] 
    #this adds a new column 
    this['Tariff Added']= this['Price'] * tariff 
    pd.merge(data, this) 

我有兩個級別的索引。我將數據分成適當的級別,然後獲得用戶輸入。這是我無法弄清楚的。我需要每個級別= 0來創建一個新的列。在這段代碼中,這變成了df,level = 0只是合適的值。然後我想將它合併回原來的df(我意識到合併可能不正確,我一次只做這一步)。

當我在終端運行它,我得到這個

data_load.py:35: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 
    this['Tariff Added']= this['Price'] * tariff 

然後失敗。我不知道爲什麼它說我正在創建一個副本,而我正在使用.iloc聲明一個新的df,並將它合併到原始文件中。

我的一個想法是在開始之前創建'關稅添加'列,但我想在此查看以查看此代碼無法工作的原因。

我一起工作的df是這個

     Quantity Price 
A    B      
NB Well  123n5/15  100  1 
      123n5/15  200  2 
      123n5/15  300  3 
      456n5/15  100  1 
      456n5/15  200  2 
      456n5/15  300  3 
excito  123n5/15  100  1 
      123n5/15  200  2 
      123n5/15  300  3 
      456n5/15  100  1 
      456n5/15  200  2 
      456n5/15  300  3 
+0

什麼是推薦輸出? – jezrael

+0

@jezrael我需要一個具有不同值的新列,具體取決於A索引 – lost

回答

0

我修改數據,更好的測試。我不知道,get_tariff()是什麼,所以我用tariff = 2

因爲比較組的指標(Series)所以條件與第1項目索引使用[0]

#     Quantity Price 
#A  B       
#NB Well 73n5/15   10  1 
#  123n5/15  200  2 
#  123n5/15  300  3 
#  456n5/15  100  1 
#  456n5/15  200  2 
#  456n5/15  300  3 
#excito 123n5/15  700  7 
#  123n5/15  200  2 
#  123n5/15  300  3 
#  456n5/15  100  1 
#  456n5/15  200  2 
#  456n5/15  300  3 

def f(df): 
    #tariff=get_tariff() 
    tariff = 2 
    if(df.index.get_level_values('A')[0] == 'excito'): 
     df['Tariff Added']= df['Price'] * tariff 
    else: 
     df['Tariff Added']= df['Price'] * 5  
    return df 

out = data.groupby(level=0).apply(f) 
print out 
#     Quantity Price Tariff Added 
#A  B          
#NB Well 73n5/15   10  1    5 
#  123n5/15  200  2   10 
#  123n5/15  300  3   15 
#  456n5/15  100  1    5 
#  456n5/15  200  2   10 
#  456n5/15  300  3   15 
#excito 123n5/15  700  7   14 
#  123n5/15  200  2    4 
#  123n5/15  300  3    6 
#  456n5/15  100  1    2 
#  456n5/15  200  2    4 
#  456n5/15  300  3    6