我的目标是在一个数据帧中转换数据并将结果输出到新的数据帧。以下是我到目前为止所使用的简化数据框:
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”。我已经尝试过以我能想到的许多不同的方式来修改我的循环,但此时我已经没有想到了。我非常感谢任何见解!
答案 0 :(得分:0)
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)