Python-熊猫,将长列拆分为多列

时间:2018-11-28 14:45:45

标签: python pandas

给出以下数据框:

>>> pd.DataFrame(data=[['a',1],['a',2],['b',3],['b',4],['c',5],['c',6],['d',7],['d',8],['d',9],['e',10]],columns=['key','value'])
  key  value
0   a      1
1   a      2
2   b      3
3   b      4
4   c      5
5   c      6
6   d      7
7   d      8
8   d      9
9   e     10

我正在寻找一种可以根据键值更改结构的方法,如下所示:

   a  b  c  d   e
0  1  3  5  7  10
1  2  4  6  8  10 <- 10 is duplicated
2  2  4  6  9  10 <- 10 is duplicated

结果行号是最长的组数(在上面的示例中为d),而丢失的值是最后一个可用值的重复项。

2 个答案:

答案 0 :(得分:4)

set_index创建MultiIndex,用计数器计数器cumcount创建,用unstack整形,用ffill重新填充最后的非缺失值,最后转换如有必要,所有数据发送到integer

df = df.set_index([df.groupby('key').cumcount(),'key'])['value'].unstack().ffill().astype(int)

具有自定义lambda函数的另一种解决方案:

df = (df.groupby('key')['value']
        .apply(lambda x: pd.Series(x.values))
        .unstack(0)
        .ffill()
        .astype(int))

print (df)
key  a  b  c  d   e
0    1  3  5  7  10
1    2  4  6  8  10
2    2  4  6  9  10

答案 1 :(得分:2)

使用pivotgroupby + cumcount

df.assign(key2=df.groupby('key').cumcount()).pivot('key2','key','value').ffill().astype(int)
Out[214]: 
key   a  b  c  d   e
key2                
0     1  3  5  7  10
1     2  4  6  8  10
2     2  4  6  9  10