如何用控制语句迭代列?

2024-04-25 14:17:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在有以下代码:

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循环中实现这一点


Tags: columnsto代码in区域dataframedfarea
1条回答
网友
1楼 · 发布于 2024-04-25 14:17:45

我无法摆脱你的整个方法有问题的怀疑。第一个危险信号是使用wide format instead of long format——以我的经验,这可能会给您带来不必要的麻烦

不管怎样,这里有一个函数,它接受一个包含时间序列数据的数据帧和另一个包含乘数值和区域名称的数据帧作为参数。这两个数据帧使用与示例df_timeseries(区域名称作为列,时间序列值作为单元格值)和df_area(区域名称作为列area中的值,乘数作为列factor中的值)相同的结构。我敢肯定,这不是一个好的方式来组织您的数据,但这取决于您的决定

函数所做的是遍历第二个数据帧的行(类似于df_area)。它使用area值从第一个数据帧(类df_timeseries)中选择正确的序列,并将该序列与该行的factor值相乘。结果作为元素添加到列表生成器中

def do_magic(df1, df2):
    return [df1[area] * factor for area, factor in zip(df2.area, df2.factor)]

您可以将其直接插入到代码中以替换循环:

df_area = pd.DataFrame({"area": ["Coesfeld", "Recklinghausen"],
                        "factor": [2, 5]})
df_timeseries = pd.DataFrame({"Coesfeld": [1000, 2000, 3000, 4000],
                              "Recklinghausen": [2000, 5000, 6000, 7000]})

newlist = do_magic(df_timeseries, df_area)
newframe = pd.DataFrame(newlist)    
df1_transposed = newframe.T

它也适用于扩展的df_area。结果列表将由四个系列组成(两个用于Coesfeld,两个用于Recklinghausen

相关问题 更多 >