繁体   English   中英

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

[英]Looping a function through Pandas dataframe with iterrows

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

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”。 我已经尝试过以我能想到的许多不同的方式来修改我的循环,但此时我已经没有想到了。 我非常感谢任何见解!

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

你的代码效率很低。 在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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM