gpt4 book ai didi

python - pandas - 转换数据 View

转载 作者:太空宇宙 更新时间:2023-11-03 13:41:49 25 4
gpt4 key购买 nike

我有如下所示的 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'找到父级并相应地设置父级。这是最有效的方法吗?

最佳答案

我能想到的最好的方法是通过 pandas reshape 索引和名称,并使用 numpy reshape 值。

首先,让我们 reshape numpy 中的数值:

arr = df.ix[:,'gross1':'balance2'].values.reshape(9,2)

array([[ 100, 101],
[ 50, 51],
[ 200, 201],
[ 201, 202],
[ 40, 41],
[ 300, 3001],
[ 300, 303],
[ 99, 98],
[ 1000, 10001]], dtype=int64)

现在让我们 reshape pandas 中的数据框,使索引和列名更接近我们想要的:

df2 = df.set_index(['id','date','name']).stack().iloc[::2].reset_index().iloc[:,:-1]

id date name level_3
0 1 01/01/2001 abc gross1
1 1 01/01/2001 abc net1
2 1 01/01/2001 abc balance1
3 2 01/02/2001 def gross1
4 2 01/02/2001 def net1
5 2 01/02/2001 def balance1
6 3 01/03/2001 ghi gross1
7 3 01/03/2001 ghi net1
8 3 01/03/2001 ghi balance1

这基本上是其中的 90%,现在将它们组合起来:

df2[['value1','value2']] = pd.DataFrame(arr)

id date name level_3 value1 value2
0 1 01/01/2001 abc gross1 100 101
1 1 01/01/2001 abc net1 50 51
2 1 01/01/2001 abc balance1 200 201
3 2 01/02/2001 def gross1 201 202
4 2 01/02/2001 def net1 40 41
5 2 01/02/2001 def balance1 300 3001
6 3 01/03/2001 ghi gross1 300 303
7 3 01/03/2001 ghi net1 99 98
8 3 01/03/2001 ghi balance1 1000 10001

我不确定您打算如何使用级别/父级列,但您可以通过以下方式设置它们:

df2['parent'] = df2.groupby('id').cumcount()
df2['parent_index'] = df2[ df2.parent == 0 ].index.to_series()
df2['parent_index'] = df2.parent_index.fillna(method='ffill')
df2['parent'] = np.where( df2.parent > 1, 1, df2.parent )
df2['parent_index'] = np.where( df2.parent == 0, np.nan, df2.parent_index )

id date name level_3 value1 value2 parent parent_index
0 1 01/01/2001 abc gross1 100 101 0 NaN
1 1 01/01/2001 abc net1 50 51 1 0
2 1 01/01/2001 abc balance1 200 201 1 0
3 2 01/02/2001 def gross1 201 202 0 NaN
4 2 01/02/2001 def net1 40 41 1 3
5 2 01/02/2001 def balance1 300 3001 1 3
6 3 01/03/2001 ghi gross1 300 303 0 NaN
7 3 01/03/2001 ghi net1 99 98 1 6
8 3 01/03/2001 ghi balance1 1000 10001 1 6

关于python - pandas - 转换数据 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29294646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com