【发布时间】:2015-04-01 03:03:16
【问题描述】:
我有如下图所示的 pandas 数据框,其中 id 和 date 是索引
id name date gross1 gross2 net1 net2 balance1 balance2
1 abc 01/01/2001 100 101 50 51 200 201
2 def 01/02/2001 201 202 40 41 300 3001
3 ghi 01/03/2001 300 303 99 98 1000 10001
我想把它转换成这样的数据:
id date level parent category name value1 value1
1 01/01/2001 0 NaN gross abc 100 101
2 01/01/2001 1 1 net abc 50 51
3 01/01/2001 1 1 balance abc 200 201
4 01/02/2001 0 NaN gross def 201 201
5 01/02/2001 1 4 net def 40 41
6 01/02/2001 1 4 balance def 300 3001
7 01/03/2001 0 NaN gross ghi 300 303
8 01/03/2001 1 7 net ghi 99 98
9 01/03/2001 1 7 balance ghi 1000 10001
我尝试了旋转和取消堆叠...但无法完全正确。我来的关闭是在做如下的事情:
df_gross = df['name','gross1','gross2']
df_gross.columns = ['name', 'value1', 'value2']
df_gross['level']=0
df_gross['category']='gross'
df_net = df['name', 'net1','net2']
df_net.columns = ['name', 'value1', 'value2']
df_gross['level']=1
df_gross['category']='net'
df_balance = df['name', 'balance1','balance2']
df_balance.columns = ['name', 'value1', 'value2']
df_balance['level']=1
df_balance['category']='balance'
df = pandas.concat(df_gross, df_net, df_balance)
然而,我遇到的问题是如何有效地生成新的 id,并将父列设置为新生成的 id。
我可以..在 concat 之后,reset_index,然后删除“id”列,然后将索引设置为 pandas 生成的索引(应该是值 1..n)。然后我在想我做一个dataframe.apply通过'date'和'level = 0'找到父级并相应地设置父级。那会是最有效的方法吗?
【问题讨论】:
-
为什么第一个父ID是NaN?这是想要的吗?
-
是..null..表示顶级。我想我可以自己做。
-
我刚刚注意到“可信和/或官方消息来源”说明。不知道这意味着什么,但我的回答中的所有内容都是 numpy/pandas 的标准用法。
-
parent row必须是category = gross的那个吗?