【问题标题】:How to generate array of key:values from merging columns如何从合并列生成键数组:值
【发布时间】:2021-06-12 00:20:32
【问题描述】:

需要创建一个新列,它将合并所有月份列并将它们的值显示为键值对数组。

我已经能够合并列:

df["Consumo"] = df.iloc[:,[4,5,6,7,8,9,10,11,12,13,14,15]].values.tolist()

我只是不确定我应该如何首先映射值以排列键值数组。

当然,我可以遍历每一列,然后遍历每一行,但我需要以某种方式保留这些值,然后推入一个数组数组... 我想过这样的事情,我可以保留这个庞大的数组,然后将其推入 df["Consumo"],这样行吗?

输入数据:

Cód. Perfil Sigla Nome Empresarial ... 2020-10-01 00:00:00 2020-11-01 00:00:00 2020-12-01 00:00:00 ...
3    RGE SUL RGE SUL DISTRIBUIDORA DE ENERGIA S.A. ... 230357.542859 284340.749249 337758.293447 ...

预期输出:

Cód. Perfil Sigla Nome Empresarial Patamar Consumo
3    RGE SUL RGE SUL DISTRIBUIDORA DE ENERGIA S.A.LEVE  [2020-10-01 00:00:00: 375637.681828, 2020-10-01 00:00:00: 350523.989792, 2020-10-01 00:00:00: 314549.742607, ...

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    试试:

    df["Consumo"] = df.iloc[:,[4,5,6,7,8,9,10,11,12,13,14,15]].to_dict("records")
    df["Consumo"] = df["Consumo"].map(str).str[1:-1]
    

    to_dict 是这里的关键:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_dict.html(您只需要选择正确的输出方向dict)。

    然后第二行只是删除环绕 dict 括号。

    【讨论】:

      【解决方案2】:

      您可以对meltgroupbyapply 进行字典映射。

      使用一个简化的例子:

      import pandas as pd
      df = pd.DataFrame({
          'Perfil': ['SUL', 'ABC'], 'Sigla': ['RGE', 'XYZ'], 'Name': ['SUL', 'ABC'],
          '2020-10-01 00:00:00': [230357.542859, 372356.997901],
          '2020-11-01 00:00:00': [284340.749249, 455408.113981],
          '2020-12-01 00:00:00': [337758.293447, 698728.068559],
      })
      
      Perfil Sigla Name 2020-10-01 00:00:00 2020-11-01 00:00:00 2020-12-01 00:00:00
      0 SUL RGE SUL 230357.542859 284340.749249 337758.293447
      1 ABC XYZ ABC 372356.997901 455408.113981 698728.068559

      非月份列的第一个melt

      non_months = df.columns[0:3] # change as needed for the real data
      df = df.melt(id_vars=non_months)
      
      Perfil Sigla Name variable value
      0 SUL RGE SUL 2020-10-01 00:00:00 230357.542859
      1 ABC XYZ ABC 2020-10-01 00:00:00 372356.997901
      2 SUL RGE SUL 2020-11-01 00:00:00 284340.749249
      3 ABC XYZ ABC 2020-11-01 00:00:00 455408.113981
      4 SUL RGE SUL 2020-12-01 00:00:00 337758.293447
      5 ABC XYZ ABC 2020-12-01 00:00:00 698728.068559

      然后groupby 非月份列和apply 字典映射:

      df = (df.groupby(list(non_months))
              .apply(lambda x: dict(zip(x.variable, x.value)))
              .to_frame(name='Consumo'))
      
      Perfil Sigla Name Consumo
      ABC XYZ ABC {'2020-10-01 00:00:00': 372356.997901, '2020-1...
      SUL RGE SUL {'2020-10-01 00:00:00': 230357.542859, '2020-1...

      注意:如果想要稍微好一点的性能,可以replace the dict-zip lambda with Series.to_dict

      lambda x: pd.Series(x.value.values, index=x.variable).to_dict()
      

      【讨论】:

        【解决方案3】:

        也许有一种更优雅的方法,但是,这个对我有用:

        for col in df.iloc[:,[4,5,6,7,8,9,10,11,12,13,14,15]]:
            i = df.columns.get_loc(col)
            for j, row_value in df[col].iteritems():
                if i == 4:
                    series.append([{col:row_value}])
                else:
                    series[j].append({col:row_value})
        
        df["Consumo"] = series
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-04-21
          • 1970-01-01
          • 2021-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多