使用列名作为因子高效地转换pandas数据框。

3

我想将一个由软件提供的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个回答

2

使用MultiIndex.from_arrays创建解决方案,通过字符串索引和转置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

太好了,很高兴能为你效劳!祝你有愉快的一天! - jezrael

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。它可以非常有用。

谢谢你的回答和建议,我会更仔细地研究melt函数。 - S-Oxyde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接