【问题标题】:Create dictionary by index in from pandas dataframe从熊猫数据框中按索引创建字典
【发布时间】:2020-02-20 20:55:25
【问题描述】:

我的数据是 200 列 ID,值为 10 年。我只对每月值感兴趣,所以我将月份列指定为数据框索引并删除了日期列。我想创建一个字典,其中 ID 是键,并且在每个 ID 中有 12 个月,每个月的第一个非零值。像这样 [ID][MONTH] = value

这是我目前所拥有的。我在遍历数据框并按索引将值分配给字典时遇到问题。

 IDdict=dict()


    df = pd.read_csv('data.csv')
    df.drop(['DATE'], axis=1, inplace=True)
    df = df.set_index(['Month'])

   IDs =[]
    IDs = list(df.columns)

    for ID in IDs:
        IDdict[ID]=dict()

【问题讨论】:

    标签: python pandas dataframe datetime dictionary


    【解决方案1】:

    months = 所有月份的列表

    for ID in IDs:
        IDdict = dict()
        for month in months:
            IDdict[month] = df[(df["Month"]==month)&(df[ID]!=0)].index[0]
    

    【讨论】:

      【解决方案2】:

      我建议对索引使用数值而不是月份名称。这样数据透视表将更容易按索引排序。

      df = pd.DataFrame(
          [
              ('1/1/2014', 1, -950, -5954, 0, 0, -64430),
              ('1/1/2015', 1, 0, -5084, 0, 0, -29896),
              ('2/1/1995', 2, -5160, -1403, 0, 0, -16281),
              ('2/1/1996', 2, 0, -1573, 0, -14, -30772),
          ],
          columns=['Date', 'Month', 'ID_1', 'ID_2', 'ID_3', 'ID_4', 'ID_5']
      )
      #        Date  Month  ID_1  ID_2  ID_3  ID_4   ID_5
      # 0  1/1/2014      1  -950 -5954     0     0 -64430
      # 1  1/1/2015      1     0 -5084     0     0 -29896
      # 2  2/1/1995      2 -5160 -1403     0     0 -16281
      # 3  2/1/1996      2     0 -1573     0   -14 -30772
      

      使用pd.melt将数据转换为长格式

      df = df.melt(id_vars=['Date', 'Month'], var_name='ID')
      #        Date  Month    ID  value
      # 0  1/1/2014      1  ID_1   -950
      # 1  1/1/2015      1  ID_1      0
      # 2  2/1/1995      2  ID_1  -5160
      # 3  2/1/1996      2  ID_1      0
      # 4  1/1/2014      1  ID_2  -5954
      

      删除所有零值

      df = df[df.value != 0]
      #        Date  Month    ID  value
      # 0  1/1/2014      1  ID_1   -950
      # 2  2/1/1995      2  ID_1  -5160
      # 4  1/1/2014      1  ID_2  -5954
      # 5  1/1/2015      1  ID_2  -5084
      # 6  2/1/1995      2  ID_2  -1403
      

      按月份和ID分组并取第一行

      df = df.groupby(['Month', 'ID']).first().reset_index()
      #    Month    ID      Date  value
      # 0      1  ID_1  1/1/2014   -950
      # 1      1  ID_2  1/1/2014  -5954
      # 2      1  ID_5  1/1/2014 -64430
      # 3      2  ID_1  2/1/1995  -5160
      # 4      2  ID_2  2/1/1995  -1403
      # 5      2  ID_4  2/1/1996    -14
      # 6      2  ID_5  2/1/1995 -16281
      

      使用df.pivot_table将表格转回宽格式,其中每列是一个月

      df = df.pivot_table(index='Month', columns='ID', values='value')
      # ID       ID_1    ID_2  ID_4     ID_5
      # Month
      # 1      -950.0 -5954.0   NaN -64430.0
      # 2     -5160.0 -1403.0 -14.0 -16281.0
      

      使用df.to_dict将数据帧转换为字典

      df.to_dict('list')
      # {'ID_1': [-950.0, -5160.0], 'ID_2': [-5954.0, -1403.0], 'ID_4': [nan, -14.0], 'ID_5': [-64430.0, -16281.0]}
      

      【讨论】:

        猜你喜欢
        • 2021-02-04
        • 2016-01-14
        • 2014-11-22
        • 1970-01-01
        • 1970-01-01
        • 2016-01-13
        • 2020-08-14
        • 2019-11-12
        相关资源
        最近更新 更多