数据转换:取列值作为列名

Data transformation: Take column value as column name

我有一个这样的数据框

df = {'ID': ['A', 'B', 'C'], '2': ['colname1', 'colname2', 'colname1'], '3': [3, 4, 0], '4':['colname3', 'colname3', 'colname3'], '5':[0, 2, 1]}
old = pd.DataFrame(data=df)
old

    ID  2           3       4       5
0   A   colname1    3   colname3    0
1   B   colname2    4   colname3    2
2   C   colname1    0   colname3    1

其中 ID A 的 colname1 值为 3,ID B 的 colname2 值为 4。

我正在尝试清理它,使其看起来像

df = {'ID': ['A', 'B', 'C'], 'colname1': [3, 'None', 0], 'colname2': ['None', 4, 'None'], 'colname3':[0, 2, 1]}
new = pd.DataFrame(data=df)
new

    ID  colname1    colname2    colname3
0   A   3           None        0
1   B   None        4           2
2   C   0           None        1

请注意这是一个简单的示例。实际数据集比这大很多。

我的想法是构建另一个数据框,首先提取所有不同的列名(出现在偶数列)。

df.iloc[:,1::2].T.apply(lambda x: x.unique(), axis=1)

然后,编写一个循环,将值从旧数据帧提取到新数据帧。

但我不确定如何进行。有更好的方法吗?

一个想法是使用 lreshapeDataFrame.pivot:

c1 = old.columns[1::2]
c2 = old.columns[2::2]

df = pd.lreshape(old, {'a':c1, 'b':c2}).pivot('ID','a','b')
#alternative if duplicates in `ID`, `a` pairs
#df = pd.lreshape(old, {'a':c1, 'b':c2}).pivot_table(index='ID',columns='a',values='b', aggfunc='mean')
print (df)
a   colname1  colname2  colname3
ID                              
A        3.0       NaN       0.0
B        NaN       4.0       2.0
C        0.0       NaN       1.0