2017-06-17 97 views
1

我的目標是轉換一個數據幀中的數據並將結果輸出到新的數據幀。這裏是我到目前爲止,使用簡化的數據幀:通過熊貓數據幀循環訪問函數

import math 
import pandas as pd 
data = {'A':[1,4,3,5,7],'B':[0,6,3,0,2],'C':[1,1,3,0,4]} #sample data 
df = pd.DataFrame(data) 
transDF = pd.DataFrame() #empty dataframe for results 

def Chord(y): #Chord transformation function 
    ySUM = sum(a*a for a in y) 
    ySUMsqrt = math.sqrt(ySUM) 
    yPRIME = [] 
    for a in y: 
     RESULT = a/ySUMsqrt 
     yPRIME.append(RESULT) 
    return yPRIME 

for Yi, row in df.iterrows(): #my attempt at a loop 
    Yrow = df.loc[df.index == Yi] 
    y = yRow.values.tolist() 
    tfRow = float(Chord(y)) 
    transDF = transDF.append(tfRow) 

,如果我只是給它一個列表本身工作的功能,但是當我嘗試環路我得到,說:「不能乘序列錯誤類型'list'的非整型。我嘗試過儘可能多的修改我的循環,但在這一點上,我已經沒有想法了。我將不勝感激任何見解!

+0

的問題是,你的函數需要一個列表,而不是一個列表中的列表,簡單地解決您的功能改變此行以'Y = yRow.values.tolist()[0]'或者你可以改變你的函數通過這麼做來獲得'x'的變量數量,'def Chord(* y)' –

回答

0

IIUC,我不認爲需要這個問題iterrows。

import math 
data = {'A':[1,4,3,5,7],'B':[0,6,3,0,2],'C':[1,1,3,0,4]} #sample data 
df = pd.DataFrame(data) 
transDF = pd.DataFrame() #empty dataframe for results 

def Chord(y): #Chord transformation function 
    ySUM = sum(a*a for a in y) 
    ySUMsqrt = math.sqrt(ySUM) 
    yPRIME = [] 
    for a in y: 
     RESULT = a/ySUMsqrt 
     yPRIME.append(RESULT) 
    return yPRIME 

transDF = df.apply(Chord) 
print(transDF) 

輸出:

 A   B  C 
0 0.1 0.000000 0.19245 
1 0.4 0.857143 0.19245 
2 0.3 0.428571 0.57735 
3 0.5 0.000000 0.00000 
4 0.7 0.285714 0.76980 
+0

這使得事情變得簡單多了!這很好。 –

0

你的代碼是非常低效的。 在熊貓中循環播放幾乎總是不必要的,循環播放單個元素應該更加罕見。

利用numpys矢量化!

import pandas as pd 
import numpy as np 

def chord_transform(row): 
    return row/np.sum(row**2) 

data = {'A':[1,4,3,5,7],'B':[0,6,3,0,2],'C':[1,1,3,0,4]} #sample data 
df = pd.DataFrame(data) 
df_chord = df.apply(chord_transform, axis=1) 
+0

'.apply' *會循環遍歷行。雖然,我同意,'np.sum(row ** 2)'更可取。 –

+0

謝謝。我對python還是個新手,所以我現在寫的東西幾乎沒有效率。 :)我很欣賞這個輸入,而且我正在編寫的程序的其餘部分在結構上類似,這一定會有所幫助! –