通过pandas中两行的值将行转换为列

时间:2018-04-20 14:55:10

标签: python pandas

我有一个大型数据集,它有两列Name, Value,它看起来像这样:

import pandas as pd
data = [['code',10],['classe',12],['series','B'], ['code',12],['classe',1],
['series','C'],['code',16],['classe',18],['series','A']]
df1 = pd.DataFrame(data,columns=['Name','Value'])
df1

输出

    Name    Value
0   code    10
1   classe  12
2   series  B
3   code    12
4   classe  1
5   series  C
6   code    16
7   classe  18
8   series  A

我想要这样的事情:

    code  classe series
0   10      10    B
1   12      1     C
2   16      18    A

在我的数据集中,它会重新获得N次,我想将其转换为三列code, classe, series

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

您可以使用.pivot

完成此操作
df2 = df1.pivot(columns='Name', values='Value')
pd.concat([df2[series].dropna().reset_index(drop=True) for series in df2], axis=1)

<强>输出

  classe    code    series
0   12       10     B
1   1        12     C
2   18       16     A

更重要的是,如果您更改了有序数据,您仍然可以获得所需的输出:

import pandas as pd
data = [['code',10],['classe',12],['classe', 14], ['series','B'], ['series', 'C'], ['code',12],['classe',1],
['series','C'],['code',16],['classe',18],['series','A']]
df1 = pd.DataFrame(data,columns=['Name','Value'])
df1

    Name    Value
0   code    10
1   classe  12
2   classe  14 #Added classe
3   series  B
4   series  C  #Added Series
5   code    12
6   classe  1
7   series  C
8   code    16
9   classe  18
10  series  A

输出将是:

   classe   code    series
0   12       10      B
1   14       12      C
2   1        16      C
3   18      NaN      A

答案 1 :(得分:3)

选项1
带有pd.concat的{​​{1}}应该这样做。

groupby

选项2
pd.concat([ pd.Series(v.values, name=k) for k, v in df1.groupby('Name')['Value'] ], axis=1 ) classe code series 0 12 10 B 1 1 12 C 2 18 16 A
Flaky pivot hack,不要指望它!此解决方案假定pivot内的值定期交替 - 代码,classe,系列,代码,classe,系列,...等等。否则不会工作。

Name

答案 2 :(得分:2)

使用cumsum创建新密钥,然后使用unstack

df1['new']=(df1.Name=='code').cumsum()
df1.set_index(['new','Name']).Value.unstack()
Out[80]: 
Name classe code series
new                    
1        12   10      B
2         1   12      C
3        18   16      A