我想将软件给出的DataFrame转换为更可用的python,我不能用pandas以简单的方式修复它,因为我必须使用列中包含的信息。这是一个简单的例子:
import pandas as pd
d = {'00' : [1],'01' : [11], '10': [111], '11':[1111]}
pd.DataFrame(d)
00 01 10 11
0 1 11 111 1111
列名包含我需要在行中使用的因子,我想得到这样的结果:
df = {'trt': [0,0,1,1], 'grp': [0,1,0,1], 'value':[1,11,111,1111]}
pd.DataFrame(df)
grp trt value
0 0 0 1
1 1 0 11
2 0 1 111
3 1 1 1111
关于如何正确地做到这一点的任何想法?
答案 0 :(得分:2)
MultiIndex.from_arrays
创建indexing with str并按T
转置的解决方案:
df.columns = pd.MultiIndex.from_arrays([df.columns.str[0], df.columns.str[1]])
print (df)
0 1
0 1 0 1
0 1 11 111 1111
df1 = df.T.reset_index()
df1.columns = ['grp','trt','value']
print (df1)
grp trt value
0 0 0 1
1 0 1 11
2 1 0 111
3 1 1 1111
与rename_axis
类似的解决方案并重命名index
:
d = {'00' : [1],'01' : [11], '10': [111], '11':[1111]}
df = pd.DataFrame(d)
df.columns = pd.MultiIndex.from_arrays([df.columns.str[0], df.columns.str[1]])
print(df.rename_axis(('grp','trt'), axis=1).rename(index={0:'value'}).T.reset_index())
grp trt value
0 0 0 1
1 0 1 11
2 1 0 111
3 1 1 1111
答案 1 :(得分:1)
对我来说,最简单的解决方案就是融化原始帧并在第二步中拆分列名。像这样:
df = pd.DataFrame(d)
mf = pd.melt(df)
mf[['grp', 'trt']] = mf.pop('variable').apply(lambda x: pd.Series(tuple(x)))
融化后的mf
:
variable value
0 00 1
1 01 11
2 10 111
3 11 1111
分割变量列后的最终结果:
value grp trt
0 1 0 0
1 11 0 1
2 111 1 0
3 1111 1 1
我建议你在这里阅读更多关于融化的内容:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.melt.html。它非常有用。