DataFrame转换:从多列到单列

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

DataFrame transformation: from multiple columns to one

问题

使用PandasNumPy,您可以将DataFrame从初始表格转换为如下所示的DataFrame:

  1. Name Year Nb
  2. ------+--------+--------+-------
  3. 0 | A | 2021 | 5.0
  4. 1 | A | 2020 | 4.0
  5. 2 | A | 2019 | 10.0
  6. 3 | A | 2018 | 4.0
  7. 4 | A | 2017 | 4.0
  8. ...
  9. k | A-Jay | 2021 | 5.0
  10. k+1 | A-Jay | 2020 | 6.0
  11. ...
  12. l+i | A.J. | 2019 | 3.0
  13. m | Aaban | 2021 | 4.0
  14. m+1 | Aaban | 2020 | 4.0
  15. ...

这种转换需要使用Pandas和NumPy的功能来重新构造DataFrame,包括对名称、年份和数值的变换和组合。如果您需要详细的代码示例,请提供原始DataFrame和所需的转换步骤,我可以为您提供更多的帮助。

英文:

How can I transform with Pandas & NumPy this DataFrame:

DataFrame转换:从多列到单列

to DataFrame like:

  1. Name Year Nb
  2. ------+--------+--------+-------
  3. 0 | A | 2021 | 5.0
  4. 1 | A | 2020 | 4.0
  5. 2 | A | 2019 | 10.0
  6. 3 | A | 2018 | 4.0
  7. 4 | A | 2017 | 4.0
  8. ...
  9. k | A-Jay | 2021 | 5.0
  10. k+1 | A-Jay | 2020 | 6.0
  11. ...
  12. l+i | A.J. | 2019 | 3.0
  13. m | Aaban | 2021 | 4.0
  14. m+1 | Aaban | 2020 | 4.0
  15. ...

?

答案1

得分: 0

  1. 这里有一种方式可能是最优雅的),使用`melt()`
  2. ```python
  3. out = ( df
  4. .melt(id_vars='Name', var_name='Year', value_name='Nb')
  5. .dropna()
  6. .sort_values(['Name','Year'], ascending=[True,False])
  7. .reset_index(drop=True) )

这里是另一种方式,使用stack()

  1. out = ( df
  2. .set_index('Name')
  3. .stack()
  4. .reset_index()
  5. .rename(columns={'level_1':'Year', 0:'Nb'})
  6. .sort_values(['Name','Year'],ascending=[True,False])
  7. .reset_index(drop=True) )

样本输入:

  1. Name 2021 2022 2023 2024
  2. 0 a NaN 4.0 None 0.0
  3. 1 b 2.0 NaN None NaN
  4. 2 c 3.0 6.0 None 0.0

输出:

  1. Name Year Nb
  2. 0 a 2024 0.0
  3. 1 a 2022 4.0
  4. 2 b 2021 2.0
  5. 3 c 2024 0.0
  6. 4 c 2022 6.0
  7. 5 c 2021 3.0
英文:

Here's a way (probably the most elegant) using melt():

  1. out = ( df
  2. .melt(id_vars='Name', var_name='Year', value_name='Nb')
  3. .dropna()
  4. .sort_values(['Name','Year'], ascending=[True,False])
  5. .reset_index(drop=True) )

Here's another way, this one using stack():

  1. out = ( df
  2. .set_index('Name')
  3. .stack()
  4. .reset_index()
  5. .rename(columns={'level_1':'Year',0:'Nb'})
  6. .sort_values(['Name','Year'],ascending=[True,False])
  7. .reset_index(drop=True) )

Sample input:

  1. Name 2021 2022 2023 2024
  2. 0 a NaN 4.0 None 0.0
  3. 1 b 2.0 NaN None NaN
  4. 2 c 3.0 6.0 None 0.0

Output:

  1. Name Year Nb
  2. 0 a 2024 0.0
  3. 1 a 2022 4.0
  4. 2 b 2021 2.0
  5. 3 c 2024 0.0
  6. 4 c 2022 6.0
  7. 5 c 2021 3.0

huangapple
  • 本文由 发表于 2023年2月19日 23:48:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/75501336.html
匿名

发表评论

匿名网友

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

确定