我正在尝试将一个数据框架重塑为两列,以提交给维基百科网络流量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/