如何使用控制语句迭代列?

时间:2019-10-14 12:33:17

标签: python pandas dataframe

我现在有以下代码:

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_timeseries中的区域更改时才对df_area中的列进行迭代。我的初衷是使用if语句,但是现在我不知道如何使用for循环来实现这一点。

1 个答案:

答案 0 :(得分:1)

我不能怀疑您的整个方法存在问题。第一个危险信号是您使用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)。