我有一个大型数据集,它有两列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
。
提前感谢您的帮助!
答案 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