2017-05-22 22 views
0

我需要的數據集,看起來像這樣幫助:搜索treshold值由三列(或更多)

Name1 Name2 Name3 Temp Height 
Alon Walon Balon 105  34 ] 
Alon Walon Balon 106  42 | 
Alon Walon Balon 105  33 ]-- Samples of Spot: Alon-Walon-Balon 
Alon Walon Kalon 101  11 ] 
Alon Walon Kalon 102  32 ]-- Samples of Spot: Alon-Walon-Kalon 
Alon Talon Balon 111  12 ]-- Samples of Spot: Alon-Talon-Balon 
Alon Talon Calon 121  10 ]-- Samples of Spot: Alon-Talon-Calon 

我想實現什麼?

我有空間的一個點的樣本,這一點用三個字來描述,在這種情況下,我們來看看Alon-Walon-Balon: 我想比較Temp中的每個值到其他值,比如105,如果這個值是高於105然後將其保存到另一列。 高度也是如此。

我現在怎麼做?

df = df.groupby[['Name1','Name2','Name3','Temp','Height']].size().reset_index() 
visited =() 
cntSpot = 0 
overValTemp = 0 
overValHeight = 0 
for i in len(df): 
    name1 = str(df.get_value(i,'Name1')) 
    name2 = str(df.get_value(i,'Name2')) 
    name3 = str(df.get_value(i,'Name3')) 
    if str(name1+name2+name3) in visited: 
     cntSpot+=1 
     if df.get_value(i,'Temp')>105: 
      overValTemp+=1 
     if df.get_value(i,'Height)<13: 
      overValHeight+=1 
     a = str(name1+name2+name3) 
     visited.update({a:cntSpot,overValemp,overValHeight}) 

現在我已經設置了信息字典集,每個地點有多少次超過某些值。 這是我需要的信息,一個Spot發生多少次情況。 訣竅在哪裏? csv文件超過2GB,我需要快速處理它。

回答

1

這是一個解決方案,使用熊貓groupby,肯定比循環更高效。

grouped = df.groupby(('Name1', 'Name2', 'Name3')) 

count = grouped.size() 
temp = grouped.apply(lambda x: x[x['Temp']>105].shape[0]) 
height = grouped.apply(lambda x: x[x['Height']<13].shape[0]) 

result = pd.concat([count, temp, height], 
        keys = ['Count', 'overValTemp', 'overValHeight'], 
        axis = 1) 
result.index = map(lambda x: "-".join(x), result.index.tolist()) 

結果如下:

    Count overValTemp overValHeight 
Alon-Talon-Balon  1   1    1 
Alon-Talon-Calon  1   1    1 
Alon-Walon-Balon  3   1    0 
Alon-Walon-Kalon  2   0    1 
+1

編輯答案,簡化了代碼。它現在應該更清潔。 – FLab

+0

非常好的工作,向我解釋。非常感謝你:) –

+0

很高興它有幫助。請upvote並接受答案,如果這可以解決您的問題:) – FLab