2017-01-25 74 views
1

儘管存在一些類似的問題,但我無法找到以下的直接答案。請注意,我來自R,對於Pandas來說還很新。假設我有一個熊貓數據框df,它包含兩列:「measure」(具有3個級別的unicode)和「Airquality」(numpy.float64)。計算熊貓數據框中的新列

我想創建名爲「color」的第三列,它基於「Airquality」中的值。此外,我想單獨爲「度量」的每個級別執行此操作。我已經成功地通過使用df.loc來分割「度量」上的df。然後,我計算出「色」分別在每個DF使用下面的代碼:

#calculate the maximum value of "Airquality" in df for each "measure" level: 
maxi = df['Airquality'].max() 

#initialize the column for "color" in df for each "measure" level: 
df['color'] = None 

#find the maximum value of "Airquality" in df for each "measure" level: 
maxi = df['Airquality'].max() 

#loop through the rows calculating and assigning the value for color, 
#again, in df for each "measure" level 
for i in range(len(df['Airquality'])): 
    df['color'][i] = int(100*df['Airquality'][i]/maxi)] 

然而,這種運行相當緩慢的大型數據集我的工作,我敢肯定,必須有一個更好的方法......可能使用一些熊貓功能,而且可能不會將df分成三個,每個「測量」級別一個。發佈此信息希望從衆多Python天才之一學習。

回答

3

我想你可以使用groupby工具,尤其是transform。從幀開始(順便說一句,它被認爲是習慣來舉一個例子數據框自己):

In [21]: df = pd.DataFrame({"measure": ["a","a","b","a","c","c"], 
    ...:     "aq": [10,20,30,20,30,50]}) 

In [22]: df["colour"] = (100.0 * df["aq"]/
         df.groupby("measure")["aq"].transform(max)) 

In [23]: df 
Out[23]: 
    aq measure colour 
0 10  a 50.0 
1 20  a 100.0 
2 30  b 100.0 
3 20  a 100.0 
4 30  c 60.0 
5 50  c 100.0 

它的作品,因爲我們通過分組的措施列,找到最大的AQ柱的每個不同得到正確的分母測量值,並將其廣播到整個幀,這是這樣做的:

In [24]: df.groupby("measure")["aq"].transform(max) 
Out[24]: 
0 20 
1 20 
2 30 
3 20 
4 50 
5 50 
Name: aq, dtype: int64 
+0

真棒,可以(而且更快)!我有一點接近於此,但從來沒有得到它的工作。不知道'.transform(max)'與'.max()'有什麼不同,但我會讀到它。萬分感謝!哦,我一定會在將來提供一些示例數據。 – davo1979

+0

最簡單的嘗試。 '.max()'給你一個具有三個最大值的系列,每個不同的度量都有一個值; '.transform(max)'爲您提供了一個具有六個值的系列,其中一個用於原始幀的每一行,並正確匹配。 – DSM

2

我幾乎不是天才,但我會和熊貓一起去apply。即使用這樣:

df['newcol'] = df.apply(lambda row: row['firstcolval'] * row['secondcolval'], axis=1) 

在文檔中像往常一樣更多信息:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.html

+0

謝謝,我正在考慮應用一下。但是,有沒有辦法編寫代碼,以便爲「度量」的三個級別單獨執行?還是需要繼續使用三個獨立的數據框?另外,請記住,每個「度量」級別都會有不同的「maxi」值。 – davo1979

+2

@ davo1979我不明白你的意思是分裂「措施」...你能提供問題中的示例數據和期望的輸出是什麼? – makaveli