将pandas列值转换为行

时间:2018-03-23 01:32:30

标签: python pandas

我正在尝试将数据帧转换为长格式。

我开始使用的数据框:

df = pd.DataFrame([['a', 'b'],
                   ['d', 'e'], 
                   ['f', 'g', 'h'],
                   ['q', 'r', 'e', 't']])
df = df.rename(columns={0: "Key"})

    Key 1   2   3
0   a   b   None    None
1   d   e   None    None
2   f   g   h       None
3   q   r   e       t

未指定列数,可能超过4.键后面的每个值应该有一个新行

这得到我需要的东西,但是,似乎应该有一种方法来做到这一点,而不必删除空值:

new_df = pd.melt(df, id_vars=['Key'])[['Key', 'value']]
new_df = new_df.dropna()


    Key value
0   a   b
1   d   e
2   f   g
3   q   r
6   f   h
7   q   e
11  q   t​

3 个答案:

答案 0 :(得分:5)

选项1
您应该可以使用set_index + stack

执行此操作
df.set_index('Key').stack().reset_index(level=0, name='value').reset_index(drop=True)

  Key value
0   a     b
1   d     e
2   f     g
3   f     h
4   q     r
5   q     s
6   q     t

如果您不想继续重置索引,请使用中间变量并创建新的DataFrame:

v = df.set_index('Key').stack()
pd.DataFrame({'Key' : v.index.get_level_values(0), 'value' : v.values})

  Key value
0   a     b
1   d     e
2   f     g
3   f     h
4   q     r
5   q     s
6   q     t

这里的本质是stack默认自动删除NaN(您可以通过设置dropna=False来禁用它。)

选项2
使用np.repeat和numpy的pd.DataFrame.stack版本获得更高的效果:

i = df.pop('Key').values
j = df.values.ravel()

pd.DataFrame({'Key' : v.repeat(df.count(axis=1)), 'value' : j[pd.notnull(j)]
})

  Key value
0   a     b
1   d     e
2   f     g
3   f     h
4   q     r
5   q     s
6   q     t

答案 1 :(得分:5)

使用melt(我认为dropna不会创造更多'麻烦'在这里)

df.melt('Key').dropna().drop('variable',1)
Out[809]: 
   Key value
0    a     b
1    d     e
2    f     g
3    q     r
6    f     h
7    q     s
11   q     t

如果没有dropna

s=df.fillna('').set_index('Key').sum(1).apply(list)
pd.DataFrame({'Key': s.reindex(s.index.repeat(s.str.len())).index,'value':s.sum()})


Out[862]: 
  Key value
0   a     b
1   d     e
2   f     g
3   f     h
4   q     r
5   q     s
6   q     t

答案 2 :(得分:2)

理解为 这假设键是行的第一个元素。

pd.DataFrame(
    [[k, v] for k, *r in df.values for v in r if pd.notna(v)],
    columns=['Key', 'value']
)

  Key value
0   a     b
1   d     e
2   f     g
3   f     h
4   q     r
5   q     s
6   q     t