我现在有以下代码:
import pandas as pd
df_area=pd.DataFrame({"area":["Coesfeld","Recklinghausen"],"factor":[2,5]})
df_timeseries=pd.DataFrame({"Coesfeld":[1000,2000,3000,4000],"Recklinghausen":[2000,5000,6000,7000]})
columns_in_timeseries=list(df_timeseries)
columns_to_iterate=columns_in_timeseries[0:]
newlist=[]
for i,k in enumerate(columns_to_iterate):
new=df_area.loc[i,"factor"]*df_timeseries[k]
newlist.append(new)
newframe=pd.DataFrame(newlist)
df1_transposed = newframe.T
代码将某个区域的每个因子与该区域的时间序列相乘。在本例中,代码在相乘后立即迭代行和列。在下一步中,我想按如下方式展开df_area
-Dataframe:
df_area=pd.DataFrame({"area":["Coesfeld","Coesfeld","Recklinghausen","Recklinghausen"],"factor":[2,3,5,6]})
如你所见,我对同一地区有不同的因素。目标是仅当df_area
中的区域更改时才迭代df_timeseries
中的列。我的第一个意图是使用if语句,但现在我不知道如何在for循环中实现这一点
我无法摆脱你的整个方法有问题的怀疑。第一个危险信号是使用wide format instead of long format——以我的经验,这可能会给您带来不必要的麻烦
不管怎样,这里有一个函数,它接受一个包含时间序列数据的数据帧和另一个包含乘数值和区域名称的数据帧作为参数。这两个数据帧使用与示例
df_timeseries
(区域名称作为列,时间序列值作为单元格值)和df_area
(区域名称作为列area
中的值,乘数作为列factor
中的值)相同的结构。我敢肯定,这不是一个好的方式来组织您的数据,但这取决于您的决定函数所做的是遍历第二个数据帧的行(类似于
df_area
)。它使用area
值从第一个数据帧(类df_timeseries
)中选择正确的序列,并将该序列与该行的factor
值相乘。结果作为元素添加到列表生成器中您可以将其直接插入到代码中以替换循环:
它也适用于扩展的
df_area
。结果列表将由四个系列组成(两个用于Coesfeld
,两个用于Recklinghausen
)相关问题 更多 >
编程相关推荐