通过带有iterrows的Pandas数据帧循环一个函数

时间:2017-06-17 20:02:59

标签: python pandas

我的目标是在一个数据帧中转换数据并将结果输出到新的数据帧。以下是我到目前为止所使用的简化数据框:

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)

如果我只是为它提供一个列表,函数本身就可以工作,但是当我尝试循环时,我得到一个错误,上面写着“不能将序列乘以非类型'列表'的int”。我已经尝试过以我能想到的许多不同的方式来修改我的循环,但此时我已经没有想到了。我非常感谢任何见解!

2 个答案:

答案 0 :(得分:0)

IIUC,我认为这个问题不需要它。

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

答案 1 :(得分:0)

你的代码效率很低。 在pandas中循环遍历几乎总是不必要的,并且在单个元素上循环应该更加罕见。

利用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)