我已经将XML数据转换为熊猫数据帧。现在,我希望透视数据以达到我理想的df输出。请帮助我。
我目前的出局:
data name
0 Aruba Country or Area
1 Population, total Item
2 1960 Year
3 54211 Value
4 Aruba Country or Area
5 Population, total Item
6 1961 Year
7 55438 Value
8 Aruba Country or Area
9 Population, total Item
10 1962 Year
11 56225 Value
12 Aruba Country or Area
13 Population, total Item
14 1963 Year
15 56695 Value
16 Aruba Country or Area
17 Population, total Item
18 1964 Year
19 57032 Value
我直接粘贴我用来透视的最后一行。
xml_df = xml_df.pivot(index='data', columns='name')
预期输出:
Country or Area Year Item Value
Aruba 1960 Population, total 54211
Aruba 1961 Population, total 55348
等。。。
IIUC,您可以在name
和cumcount
上尝试groupby
,后跟unstack
:
df.assign(k=df.groupby('name').cumcount()).set_index(['k','name']).unstack()
data
name Country or Area Item Value Year
k
0 Aruba Population, total 54211 1960
1 Aruba Population, total 55438 1961
2 Aruba Population, total 56225 1962
3 Aruba Population, total 56695 1963
4 Aruba Population, total 57032 1964
详:cumcount()
df.groupby('name').cumcount()
这按名称和Numbers each item in each group from 0 to the length of that group - 1
分组,并使用df.assign()
为数据帧分配一个新的列k
。然后使用set_index()
wee 将名称和k
列设置为索引,以便获得:
print(df.assign(k=df.groupby('name').cumcount()).set_index(['k','name']))
data
k name
0 Country or Area Aruba
Item Population, total
Year 1960
Value 54211
1 Country or Area Aruba
Item Population, total
Year 1961
Value 55438
2 Country or Area Aruba
Item Population, total
Year 1962
Value 56225
.......
.....
使用此数据,我们使用unstack()
,这有助于">透视(必然分层的(索引标签的级别,返回具有新级别的列标签的数据帧,其最内层由透视索引标签组成",因此这会根据需要将索引的最后一个级别(默认情况下(转换为列。
另一种使用枢轴的方式:
df['idx'] = df.name.eq('Country or Area').cumsum()
df.pivot(index='idx', columns='name', values='data')
输出:
name Country or Area Item Value Year
idx
1 Aruba Population, total 54211 1960
2 Aruba Population, total 55438 1961
3 Aruba Population, total 56225 1962
4 Aruba Population, total 56695 1963
5 Aruba Population, total 57032 1964