2016-01-17 58 views
0

我有一個csv文件像這樣:條件函數

  Landform    Number   Name Class 
0  Deltaic Plain   912   Lx  NaN 
1 Hummock and Swale   912   Lx  NaN 
2   Sand Dunes   912   Lx  NaN 
3 Hummock and Swale   939  Woodbury NaN 
4   Sand Dunes   939  Woodbury NaN 

當地貌包含Deltaic Plain,特定NameHummock and SwaleSand Dunes我要值1分配給Class

Landform包含Hummock and SwaleSand Dunes我想爲Class分配值2。

我所需的輸出是:

  Landform    Number   Name Class 
0  Deltaic Plain   912   Lx  1 
1 Hummock and Swale   912   Lx  1 
2   Sand Dunes   912   Lx  1 
3 Hummock and Swale   939  Woodbury 2 
4   Sand Dunes   939  Woodbury 2 

我知道如何爲剛1行這樣做:

def f(x): 
    if x['Landform'] == 'Hummock and Swale' : return '1' 
    else: return '2' 

df['Class'] = df.apply(f, axis=1) 

,但我不知道如何通過Name組,然後創建基於多行的條件函數。

回答

1

這個想法是在您的Number列上進行分組,並應用一個查看該組中所有地形並返回適當類的函數。這裏有一個例子:

def determineClass(landforms): 
    if all(form in landforms.values for form in ('Deltaic Plain', 'Hummock and Swale', 'Sand Dunes')): 
     return 1 
    elif all(form in landforms.values for form in ('Hummock and Swale', 'Sand Dunes')): 
     return 2 
    # etc. 
    else: 
     # return "default" class 
     return 0 

>>> df.groupby('Number').Landform.apply(determineClass) 
Number 
912 1 
939 2 
Name: Landform, dtype: int64 

如果你想分配值回班列,只需使用map,從20分鐘前在this question描述:

>>> classes = df.groupby('Number').Landform.apply(determineClass) 
>>> df['Class'] = df.Number.map(classes) 
>>> df 
      Landform Number  Name Class 
0  Deltaic Plain  912  Lx  1 
1 Hummock and Swale  912  Lx  1 
2   Sand Dunes  912  Lx  1 
3 Hummock and Swale  939 Woodbury  2 
4   Sand Dunes  939 Woodbury  2 
+0

我怎麼會修改這個代碼,以便如果'Name'只有1個'Landform',代碼仍然運行?例如'確定類(地形): 如果所有(形式('Deltaic Plain'))中的地形形式): 返回1'我想我需要將'all'換成別的東西。 –

+0

@StefanoPotter:如果只有一個值,它就會運行,它只會分配0作爲類。你需要編寫'determineClass'來完成你想要的任何邏輯。如果只有一個地形,你的問題並不能解釋你想要做什麼,所以你必須自己決定。例如,如果你想檢查「沙丘」,你可以在地形.values中做「如果」沙丘「 – BrenBarn