融化pandas df,其中变量名是该单元格的(行名+列名)

时间:2019-05-13 18:12:42

标签: python pandas

我正在尝试将数据框重塑为两列,以提交给Wikipedia Web Traffic Kaggle竞赛。现在,我有一个145063x60 df,索引名称为代理,列名称为预测日期时间。目标形状是熔化的df,每行是“ agent” +“ datetime”和预测值。

将此设为一般性问题陈述。我正在尝试使每个单元格的唯一变量名称等于该单元格的索引名称和列名称的数据框融化。

    >>> 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

3 个答案:

答案 0 :(得分:3)

使用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

答案 1 :(得分:3)

单向

s=df.stack().sort_index(level=1)
s.index=s.index.map('{0[0]}{0[1]}'.format)
s.reset_index()
Out[831]: 
   index   0
0     0A  97
1     1A  20
2     2A  80
3     3A  50
4     0B   2
5     1B  49
6     2B  37
7     3B  31
8     0C  29
9     1C  23
10    2C  28
11    3C  23

答案 2 :(得分:2)

略有不同,首先reset_index然后融化。

new_df = df.reset_index().melt(id_vars = 'index')
new_df['variable'] = new_df.iloc[:, :2].astype(str).sum(1)
new_df.drop('index', 1)

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