2015-06-12 121 views
3

我有一些相對簡單的代碼,我正在努力拼湊在一起。我有一個CSV,我已經讀入一個數據框。 CSV是面板數據(即每行唯一的公司和年度觀察結果)。我有兩列我想執行一個函數,然後我想根據函數的輸出創建新的變量。使用熊貓迭代地將列添加到數據框

這裏是我到目前爲止的代碼:

#Loop through rows in a CSV file 
for index, rows in df.iterrows(): 
    #Start at column 6 and go to the end of the file 
    for row in rows[6:]: 
     data = perform_function1(row) 
     output = perform_function2(data)  
     df.ix[index, 'new_variable'] = output 
     print output 

我想這段代碼迭代6列開始,然後轉到文件的末尾(例如,我有兩列我想執行Column6和Column7上的函數),然後根據執行的函數(例如Output6和Output7)創建新列。上面的代碼返回了Column7的輸出,但我無法弄清楚如何創建一個變量來允許我從兩個列中捕獲輸出(即,一個不被循環覆蓋的新變量)。我搜索了Stackoverflow,但沒有看到與我的問題直接相關的任何內容(可能是因爲我太大了一個noob?)。我將衷心感謝您的幫助。

感謝,

TT

附:我不確定我是否提供了足夠的細節。請讓我知道如果我需要提供更多。

+0

你能舉一個你的輸入和期望輸出的例子嗎?通過「一個新變量」,你實際上是否指「一個新的列名稱」? – BrenBarn

+0

是 - 新的列名稱。我的輸入是一段文字。該函數根據輸入文本計算可讀性統計量。因此,新變量(或新列)基本上是基於文本的可讀性統計量(Flesch-Kincaid Score)。因爲'rows'是數據集中的一行,'rows [6:]'中的行實際上正在迭代列,因此行[6:]中的行被混淆了[ – TaterTots

+0

]。 – GeauxEric

回答

4

反覆操作不會利用熊貓的功能。 Pandas的優勢在於在整個數據框架中有效地應用操作,而不是逐行迭代。對於像這樣的任務,您希望在數據中鏈接一些函數,這非常棒。你應該能夠用一條線完成整個任務。

df["new_variable"] = df.ix[6:].apply(perform_function1).apply(perform_function2) 

perform_function1將被應用到每一行,並perform_function2將被應用到所述第一函數的結果。

+0

謝謝!我試過這種方法,並收到以下錯誤: TypeError :('預期的字符串或緩衝區',發生在索引CaseNum') 我相信這是因爲我的函數被編寫來處理單個字符串(迭代列)而不是將其應用於整行。 – TaterTots

+0

等待,都是功能意味着適用於單個字符串而不是整行,或只是'perform_function1'?也許這將有助於包括你的功能(如果他們不太複雜)。 – ASGM

+0

功能很複雜。它們旨在適用於單個字符串。 – TaterTots

0

如果你想在一個數據幀

# Get the Series 
colmun6 = df.ix[:, 5] 
# perform_function1 applied to each row 
output6 = column6.apply(perform_function1) 
df["new_variable"] = output6 
0

大熊貓應用功能,某些列是相當緩慢的演技一行接一行:你好得多使用appendconcatmerge,或join整個數據幀的功能。

給予一定知道爲什麼,讓我們考慮一個隨機的數據幀例如:

import numpy as np 
import pandas as pd 
dates = pd.date_range('20130101', periods=6) 
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD')) 
df2 = df.copy() 
# operation to concatenate two dataframes 
%timeit pd.concat([df2, df]) 
1000 loops, best of 3: 737 µs per loop 
%timeit df.loc['2013-01-01'] 
1000 loops, best of 3: 251 µs per loop 
# single element operation 
%timeit df.loc['2013-01-01', 'A'] = 3 
1000 loops, best of 3: 218 µs per loop 

通知大熊貓如何有效地處理整個數據框中操作,以及如何低效它在單元素處理操作?

如果我們擴大這一點,同樣的趨勢出現,只有更明顯:

df = pd.DataFrame(np.random.randn(200, 300)) 
# single element operation 
%timeit df.loc[1,1] = 3 
10000 loops, best of 3: 74.6 µs per loop 
df2 = df.copy() 
# full dataframe operation 
%timeit pd.concat([df2, df]) 
1000 loops, best of 3: 830 µs per loop 

大熊貓進行整體上的操作,200x300數據幀的速度比它爲操作上的單個約6000倍元件。簡而言之,迭代會殺死使用熊貓的全部目的。如果您逐個訪問數據框,請考慮使用字典。