使用列名作为因子有效地转换pandas dataFrame

时间:2016-12-02 13:58:52

标签: python pandas

我想将软件给出的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

关于如何正确地做到这一点的任何想法?

2 个答案:

答案 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。它非常有用。

相关问题