如何重塑(使用pivot_wider和pivot_longer)pandas DataFrame

huangapple go评论101阅读模式
英文:

How to reshape (pivot_wider and pivot_longer) a pandas DataFame

问题

I'm struggling in reshaping DataFrame (a little complicated) using pandas.

我在使用pandas重塑DataFrame方面遇到了一些困难。

I have tried using pd.melt, .pivot(index=, columns=, values=), but it doesn't work perfectly as I intended.

我尝试过使用pd.melt.pivot(index=, columns=, values=),但结果并不完全符合我的意图。

as is :

目前的数据如下:

date location char1 char2
22-01 A a x
22-01 B b y
22-01 C c z

to be :

期望的数据如下:

date char location.A location.B location.C
22-01 char1 a b c
22-01 char2 x y z
英文:

I'm struggling in reshaping DataFrame (a little complicated) using pandas.

I have tried using pd.melt, .pivot(index=, columns=, values=), but it doesn't work perfectly as I intended.

as is :

date location char1 char2
22-01 A a x
22-01 B b y
22-01 C c z

to be :

date char location.A location.B location.C
22-01 char1 a b c
22-01 char2 x y z

答案1

得分: 2

使用DataFrame.melt之后再使用DataFrame.pivot

  1. df1 = (df.melt(['date','location'], var_name='char')
  2. .pivot(index=['date','char'], columns='location', values='value')
  3. .add_prefix('location.')
  4. .reset_index()
  5. .rename_axis(None, axis=1))
  6. print (df1)
  7. date char location.A location.B location.C
  8. 0 22-01 char1 a b c
  9. 1 22-01 char2 x y z

或者使用DataFrame.set_index,结合DataFrame.stackSeries.unstack

  1. df1 = (df.set_index(['date','location'])
  2. .rename_axis('char', axis=1)
  3. .stack()
  4. .unstack(level=1)
  5. .add_prefix('location.')
  6. .reset_index()
  7. .rename_axis(None, axis=1)
  8. )
  9. print (df1)
  10. date char location.A location.B location.C
  11. 0 22-01 char1 a b c
  12. 1 22-01 char2 x y z
英文:

Use DataFrame.melt before DataFrame.pivot:

  1. df1 = (df.melt(['date','location'], var_name='char')
  2. .pivot(index=['date','char'], columns='location', values='value')
  3. .add_prefix('location.')
  4. .reset_index()
  5. .rename_axis(None, axis=1))
  6. print (df1)
  7. date char location.A location.B location.C
  8. 0 22-01 char1 a b c
  9. 1 22-01 char2 x y z

Or DataFrame.set_index with DataFrame.stack and Series.unstack:

  1. df1 = (df.set_index(['date','location'])
  2. .rename_axis('char', axis=1)
  3. .stack()
  4. .unstack(level=1)
  5. .add_prefix('location.')
  6. .reset_index()
  7. .rename_axis(None, axis=1)
  8. )
  9. print (df1)
  10. date char location.A location.B location.C
  11. 0 22-01 char1 a b c
  12. 1 22-01 char2 x y z

答案2

得分: 1

你可以使用 janitorpivot_widerpivot_longer 进行操作:

  1. # pip install janitor
  2. import janitor
  3. (df.pivot_wider(index='date', names_from='location',
  4. names_glue="{_value}_location.{location}")
  5. .pivot_longer(index='date', names_to=('char', '.value'), names_sep='_')
  6. )

输出结果:

  1. date char location.A location.B location.C
  2. 0 22-01 char1 a b c
  3. 1 22-01 char2 x y z

使用纯 pandas,你可以在 set_indexstack 之间使用 transpose (T) 进行操作:

  1. out = (df.set_index(['location', 'date']).T.rename_axis('char').stack()
  2. .add_prefix('location.').reset_index().rename_axis(columns=None)
  3. )

输出结果:

  1. char date location.A location.B location.C
  2. 0 char1 22-01 a b c
  3. 1 char2 22-01 x y z
英文:

You can use janitor with pivot_wider and pivot_longer:

  1. # pip install janitor
  2. import janitor
  3. (df.pivot_wider(index='date', names_from='location',
  4. names_glue = "{_value}_location.{location}")
  5. .pivot_longer(index='date', names_to=('char', '.value'), names_sep='_')
  6. )

Output:

  1. date char location.A location.B location.C
  2. 0 22-01 char1 a b c
  3. 1 22-01 char2 x y z

With pure pandas, you can use a transpose (T) in between set_index and stack:

  1. out = (df.set_index(['location', 'date']).T.rename_axis('char').stack()
  2. .add_prefix('location.').reset_index().rename_axis(columns=None)
  3. )

Output:

  1. char date location.A location.B location.C
  2. 0 char1 22-01 a b c
  3. 1 char2 22-01 x y z

huangapple
  • 本文由 发表于 2023年2月10日 15:50:34
  • 转载请务必保留本文链接:https://go.coder-hub.com/75408246.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定