DataFrame转换:从多列到单列

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

DataFrame transformation: from multiple columns to one

问题

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

        Name      Year     Nb 
------+--------+--------+-------
0     |  A     |   2021 |  5.0
1     |  A     |   2020 |  4.0
2     |  A     |   2019 | 10.0
3     |  A     |   2018 |  4.0
4     |  A     |   2017 |  4.0
...
k     |  A-Jay |   2021 |  5.0
k+1   |  A-Jay |   2020 |  6.0
...
l+i   |  A.J.  |   2019 |  3.0
m     |  Aaban |   2021 |  4.0
m+1   |  Aaban |   2020 |  4.0
...

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

英文:

How can I transform with Pandas & NumPy this DataFrame:

DataFrame转换:从多列到单列

to DataFrame like:

        Name      Year     Nb 
------+--------+--------+-------
0     |  A     |   2021 |  5.0
1     |  A     |   2020 |  4.0
2     |  A     |   2019 | 10.0
3     |  A     |   2018 |  4.0
4     |  A     |   2017 |  4.0
...
k     |  A-Jay |   2021 |  5.0
k+1   |  A-Jay |   2020 |  6.0
...
l+i   |  A.J.  |   2019 |  3.0
m     |  Aaban |   2021 |  4.0
m+1   |  Aaban |   2020 |  4.0
...

?

答案1

得分: 0

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

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

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

样本输入:

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

输出:

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

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

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

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

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

Sample input:

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

Output:

  Name  Year   Nb
0    a  2024  0.0
1    a  2022  4.0
2    b  2021  2.0
3    c  2024  0.0
4    c  2022  6.0
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:

确定