gpt4 book ai didi

python - 通过从不同的数据框中获取值并对其执行一些数学运算来创建一个新的 pandas 数据框

转载 作者:行者123 更新时间:2023-11-28 22:31:25 25 4
gpt4 key购买 nike

假设我有一个包含 16 列和大约 1000 行的 pandas 数据框,格式是这样的

date_time   sec01   sec02   sec03   sec04   sec05   sec06   sec07   sec08   sec09   sec10   sec11   sec12   sec13   sec14   sec15   sec16

1970-01-01 05:54:17 8.50 8.62 8.53 8.45 8.50 8.62 8.53 8.45 8.42 8.39 8.39 8.40 8.47 8.54 8.65 8.70
1970-01-01 05:56:55 8.43 8.62 8.55 8.45 8.43 8.62 8.55 8.45 8.42 8.39 8.39 8.40 8.46 8.53 8.65 8.71

现在我需要制作另一个包含 32 列的 pandas 数据框:

x_sec01 y_sec01 x_sec02 y_sec02 x_sec03 y_sec03 x_sec04 y_sec04 x_sec05 y_sec05 x_sec06 y_sec06 x_sec07 ...

其中每列的值需要乘以一个特定的数学常数,该常数取决于列号(扇区号):

x = sec_data * (math.cos(math.radians(1.40625*(sector_number))))
y = sec_data * (math.sin(math.radians(1.40625*(sector_number))))

因此,原始 pandas 数据帧 (sec01-sec16) 中的每一列都需要转换为两列 (x_sec01,y_sec01),并且必须乘以的因子取决于 sector_number 值。

目前我正在使用这个函数并为 for 循环中的每一行调用它,这会花费太多时间。

def sec_to_xy(sec_no,sec_data):  #function to convert sector data to xy coordinate system
for sec_convno in range(0,32,2):
sector_number = (77-(sec_no-1)*2) #goes from 79 till 49
x = sec_data * (math.cos(math.radians(1.40625*(sector_number))))
y = sec_data * (math.sin(math.radians(1.40625*(sector_number))))
return(x,y)

最佳答案

总体思路是堆叠您的值,以便您可以应用 numpy 的快速矢量化函数。

# stack the dataframe
df2 = df.stack().reset_index(level=1)
df2.columns = ['sec', 'value']
# extract the sector number
df2['sec_no'] = df2['sec'].str.slice(-2).astype(int)

# apply numpy's vectorized functions
import numpy as np
df2['x'] = df2['value'] * (np.cos(np.radians(1.40625*(df2['sec_no']))))
df2['y'] = df2['value'] * (np.sin(np.radians(1.40625*(df2['sec_no']))))

在这个阶段,df2 看起来像这样:

                       sec  value  sec_no         x         y
1970-01-01 05:54:17 sec01 8.50 1 8.497440 0.208600
1970-01-01 05:54:17 sec02 8.62 2 8.609617 0.422963
1970-01-01 05:54:17 sec03 8.53 3 8.506888 0.627506
1970-01-01 05:54:17 sec04 8.45 4 8.409311 0.828245
1970-01-01 05:54:17 sec05 8.50 5 8.436076 1.040491

现在旋转表格以恢复到原来的形状:

df2[['sec', 'x', 'y']].pivot(columns='sec')

剩下要做的就是重命名列。

关于python - 通过从不同的数据框中获取值并对其执行一些数学运算来创建一个新的 pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41590993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com