【问题标题】:Pivot column and column values in pandas dataframe透视熊猫数据框中的列和列值
【发布时间】:2023-03-11 08:50:02
【问题描述】:

我有一个看起来像这样的数据框,但有 26 行和 110 列:

index/io   1   2   3   4
  0        42  53  23  4
  1        53  24  6   12
  2        63  12  65  34
  3        13  64  23  43

期望的输出:

index  io  value
0      1   42
0      2   53
0      3   23
0      4   4
1      1   53
1      2   24
1      3   6
1      4   12
2      1   63
2      2   12
... 

我通过将数据帧转换为字典来尝试使用字典和列表,然后使用索引值创建一个新列表并使用 io 在新字典中更新。

indx = []

for key, value in mydict.iteritems():
    for k, v in value.iteritems():
        indx.append(key)
indxio = {}
for element in indx:
    for key, value in mydict.iteritems():
        for k, v in value.iteritems():
            indxio.update({element:k})

我知道这可能太过分了,但这是我唯一能想到的。这个过程太长了,所以我停了下来。

【问题讨论】:

    标签: python pandas dictionary dataframe


    【解决方案1】:

    你需要set_index + stack + rename_axis + reset_index

    df = df.set_index('index/io').stack().rename_axis(('index','io')).reset_index(name='value')
    print (df)
        index io  value
    0       0  1     42
    1       0  2     53
    2       0  3     23
    3       0  4      4
    4       1  1     53
    5       1  2     24
    6       1  3      6
    7       1  4     12
    8       2  1     63
    9       2  2     12
    10      2  3     65
    11      2  4     34
    12      3  1     13
    13      3  2     64
    14      3  3     23
    15      3  4     43
    

    解决方案有melt,rename,但是值的顺序不同,所以sort_values是必要的:

    d = {'index/io':'index'}
    df = df.melt('index/io', var_name='io', value_name='value') \
           .rename(columns=d).sort_values(['index','io']).reset_index(drop=True)
    print (df)
        index io  value
    0       0  1     42
    1       0  2     53
    2       0  3     23
    3       0  4      4
    4       1  1     53
    5       1  2     24
    6       1  3      6
    7       1  4     12
    8       2  1     63
    9       2  2     12
    10      2  3     65
    11      2  4     34
    12      3  1     13
    13      3  2     64
    14      3  3     23
    15      3  4     43
    

    numpy 爱好者的替代解决方案:

    df = df.set_index('index/io')
    a = np.repeat(df.index,  len(df.columns))
    b = np.tile(df.columns, len(df.index))
    c = df.values.ravel()
    cols = ['index','io','value']
    df = pd.DataFrame(np.column_stack([a,b,c]), columns = cols)
    print (df)
       index io value
    0      0  1    42
    1      0  2    53
    2      0  3    23
    3      0  4     4
    4      1  1    53
    5      1  2    24
    6      1  3     6
    7      1  4    12
    8      2  1    63
    9      2  2    12
    10     2  3    65
    11     2  4    34
    12     3  1    13
    13     3  2    64
    14     3  3    23
    15     3  4    43
    

    【讨论】:

      【解决方案2】:

      您可以使用set_indexstackreset_index()

      df.set_index("index/io").stack().reset_index(name="value")\
        .rename(columns={'index/io':'index','level_1':'io'})
      

      输出:

          index io  value
      0       0  1     42
      1       0  2     53
      2       0  3     23
      3       0  4      4
      4       1  1     53
      5       1  2     24
      6       1  3      6
      7       1  4     12
      8       2  1     63
      9       2  2     12
      10      2  3     65
      11      2  4     34
      12      3  1     13
      13      3  2     64
      14      3  3     23
      15      3  4     43
      

      【讨论】:

      • 天哪,我真是个傻瓜。 A 知道此功能,但使用方式略有不同。谢谢你:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      相关资源
      最近更新 更多