2016-12-12 130 views
0

我剛開始使用熊貓,並且有一個數據框包含具有相同索引的多行,表示變量具有某些特徵,例如,熊貓:合併具有相同索引的行,同時創建一個新列

ItemID  Property Numerical_value 
A1   'Red'  10  
A1   'Fruit'  0 
B1   'Red'  25 
C1   'Liquid' 0 

對我的數據持有的假設是; 只有屬性爲「紅色」的行纔有數字值。並且 如果一個物品具有屬性'水果',它也具有屬性紅色。

我面臨的問題是將這個日期框架轉換爲每個itemID的單一編碼方案,同時也保存數值(如果存在的話)。

ItemID  Red&Fruit Just_red Other Numerical_value 
A1   1   0   0  10   
B1   0   1   0  25 
C1   0   0   1  0 

目前,我寫了下面的代碼;

def read_report: 
    fp = 'file_path' 
    df = (pd.read_csv(fp)) 
    group = df.groupby('ItemID')['Property','Numerical_value'].apply(test_function) 

def test_function(df): 
    if 'Fruit' in df.values: 
     num_val = df[df['Property'] == 'Red']['Numerical_value'].values[0] 
     return pd.Series({'Red&Fruit': '1', 'Num_val': num_val}) 
    elif 'Red' in df.values: 
     num_val= df[df['Property'] == 'Red']['Num_val'].values[0] 
     return pd.Series({'Just_red': '1', 'Num_val': num_val}) 
    else: 
     return pd.Series({'Other': '1', 'Num_val': 0}) 

這似乎不是最佳的,尤其是得到的數值爲每概括行的感覺,而哈克的方式。

有沒有更好的方法來達到同樣的效果?

+1

你的問題對我來說並不完全清楚:在第1組中,你有一個項目'紅色'和一個項目'水果',根據你所說的'紅色和水果'。這兩個不同的對象?或者任何時候有'水果',也會有'紅色'? – FLab

+0

你最後的陳述是正確的,它是同一個對象。如果我們遇到屬性'水果',我們相信它也有屬性'紅'。 –

回答

3

我會建議由集團獲得的一組屬性:

df.groupby('ItemID')['Property'].apply(set) 
Out[15]: 
ItemID 
A1 {'Red', 'Fruit'} 
B1    {'Red'} 
C1   {'Liquid'} 

然後,您可以使用get_dummies

df.groupby('ItemID')['Property'].apply(set).str.get_dummies() 
Out[17]: 
     {"'Liquid'"} {"'Red'", "'Fruit'"} {"'Red'"} 
ItemID            
A1     0      1   0 
B1     0      0   1 
C1     1      0   0 

在你的榜樣,你只需要重新命名列。但是,您可能需要在groupby操作後replace的值。

最後,合併與數值:

pd.concat([df.groupby('ItemID')['Property'].apply(set).str.get_dummies(), 
      df.groupby('ItemID')['Numerical_value'].first()], axis=1) 
Out[21]: 
     {"'Liquid'"} {"'Red'", "'Fruit'"} {"'Red'"} Numerical_value 
ItemID                 
A1     0      1   0    10 
B1     0      0   1    25 
C1     1      0   0    0 

在這裏,我採取的第一個數值,因爲在你的榜樣。

相關問題