我正在尝试将一个数据框架重塑为两列,以提交给维基百科网络流量kaggle竞赛。现在我有一个145063x60 df,索引名作为代理,列名作为预测日期时间。目标形状是一个熔化的df,每一行是一个“代理”+“日期时间”和预测值。
使之成为一般性的问题陈述。我试图将一个数据帧与每个单元格的唯一变量名(等于该单元格的索引名和列名)融为一体。

    >>> import numpy as np
    >>> import pandas as pd
    >>> df = pd.DataFrame(np.random.randint(0,100,size=(4, 3)), columns=list('ABC'))
    >>> df

        A   B   C
    0  61   9  54
    1  37  58  76
    2  46   9  32
    3  13  57  54

转换为。。。
    >>> A  = [str(x)+'A' for x in range(4)]
    >>> B  = [str(x)+'B' for x in range(4)]
    >>> C  = [str(x)+'C' for x in range(4)]
    >>> df = df.melt()
    >>> df.variable = (A+B+C)
    >>> df

       variable  value
    0        0A     61
    1        1A     37
    2        2A     46
    3        3A     13
    4        0B      9
    5        1B     58
    6        2B      9
    7        3B     57
    8        0C     54
    9        1C     76
    10       2C     32
    11       3C     54

最佳答案

使用melt+cumcount

u = df.melt()
v = u.groupby('variable').cumcount().astype(str)
u.assign(variable=v + u.variable)

   variable  value
0        0A     61
1        1A     37
2        2A     46
3        3A     13
4        0B      9
5        1B     58
6        2B      9
7        3B     57
8        0C     54
9        1C     76
10       2C     32
11       3C     54

如果您想要一种更有用的方法来查看此数据,可以考虑将其保留为自己的列,以便于查找。
df.assign(counter=np.arange(df.shape[0])).melt('counter')

    counter variable  value
0         0        A     61
1         1        A     37
2         2        A     46
3         3        A     13
4         0        B      9
5         1        B     58
6         2        B      9
7         3        B     57
8         0        C     54
9         1        C     76
10        2        C     32
11        3        C     54

关于python - 融化pandas df,其中变量名是该单元格的(行名+列名),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56117772/

10-10 14:27