用熊猫将多列取消列出到行中

克劳迪(Claudiu Creanga)

我有一个像这样的json文件:

{
  "A": {
    "type1": [
      2,
      26,
      288,
      ...
     ],
     "type2": [
      2,
      3,
      5,
      ...
     ],
     "type3": [
      23,
      26,
      288,
      ...
     ]
  },
  "B": {
    "type1": [
      2,
      26,
      288,
      ...
     ],
     "type2": [
      2,
      3,
      5,
      ...
     ],
     "type3": [
      23,
      26,
      288,
      ...
     ]
  },
...
  "K": {
    "type1": [
      2,
      26,
      288,
      ...
     ],
     "type2": [
      2,
      3,
      5,
      ...
     ],
     "type3": [
      23,
      26,
      288,
      ...
     ]
  }
}

这是用于复制的示例字典(我从A到J大约有20列,但只有3种类型:type1,type2,type3):

pd.DataFrame({'A': {'type1': ['32',
   '21',
   '43',
   '43',
   '43',
   '43',
   '43',
   '43'],
  'type2': [
   0.133333333333333,
   0.36666666666666703,
   0.1,
   0.30000000000000004,
   0.16666666666666702,
   0.033333333333333,
   0.2,
   0.066666666666666],
  'type3': [
   3,
   9,
   5,
   1,
   6,
   2]},
 'B': {'type1': [
   '43',
   '43',
   '43',
   '43',
   '43'],
  'type2': [
   0.23333333333333303,
   0.266666666666667,
   0.30000000000000004,
   0.5666666666666671,
   0.16666666666666702,
   0.266666666666667],
  'type3': [
   10,
   6,
   17,
   7,
   8,
   9,
   17,
   5,
   8]},
 'C': {'type1': [
   '43',
   '43',
   '43',
   '43',
   '43',
   '43'],
  'type2': [
   5.23333333333333,
   6.1,
   5.4,
   3.23333333333333,
   17.4,
   5.56666666666667,
   10.4333333333333,
   2.1],
  'type3': [
   183,
   162,
   97,
   522,
   167,
   313,
   63]},
 })

给出这样的df: 在此处输入图片说明

我的df最后应该看起来像这样:

  type1  type2  type3
A 32     0.13    3
A 21     0.36    9
A
........
B
........
C
........
J

所以我调换了它:在此处输入图片说明但是后来我不确定如何解压缩这些列表。每次尝试时,我都会遇到一些循环:

for x in df.index:
    for y in df.loc[x]["type1"]:
        df.iloc[index] = df.append({"index": x, "type": y}, ignore_index=True)
        index += 1

而且显然不是要走的路。

我想知道是否有更简单的方法,也许是在加载json时?

谢谢!

BEN_YO

我正在使用for循环这.apply(pd.Series).stack是关键

df=df.T
l=[df[x].apply(pd.Series).stack() for x in df.columns]

s=pd.concat(l,1).reset_index(level=1,drop=True)
s.columns=df.columns

s
Out[347]: 
  type1      type2  type3
A    32   0.133333    3.0
A    21   0.366667    9.0
A    43   0.100000    5.0
A    43   0.300000    1.0
A    43   0.166667    6.0
A    43   0.033333    2.0
A    43   0.200000    NaN
A    43   0.066667    NaN
B    43   0.233333   10.0
B    43   0.266667    6.0
B    43   0.300000   17.0
B    43   0.566667    7.0
B    43   0.166667    8.0
B   NaN   0.266667    9.0
B   NaN        NaN   17.0
B   NaN        NaN    5.0
B   NaN        NaN    8.0
C    43   5.233333  183.0
C    43   6.100000  162.0
C    43   5.400000   97.0
C    43   3.233333  522.0
C    43  17.400000  167.0
C    43   5.566667  313.0
C   NaN  10.433333   63.0
C   NaN   2.100000    NaN

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章