数据转换:取列值作为列名
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)
然后,编写一个循环,将值从旧数据帧提取到新数据帧。
但我不确定如何进行。有更好的方法吗?
一个想法是使用 lreshape
和 DataFrame.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
我有一个这样的数据框
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)
然后,编写一个循环,将值从旧数据帧提取到新数据帧。
但我不确定如何进行。有更好的方法吗?
一个想法是使用 lreshape
和 DataFrame.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