[英]Faster Alternative to Iterrows() while looping through dataframe
[英]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.