python - 带部分字符串的 Unpivot Dataframe
问题描述
我有一个数据框(totaldf),这样:
... Hom ... March Plans March Ships April Plans April Ships ...
0 CAD ... 12 5 4 13
1 USA ... 7 6 2 11
2 CAD ... 4 9 6 14
3 CAD ... 13 3 9 7
... ... ... ... ... ... ...
一年中的所有月份。我希望它是:
... Hom ... Month Plans Ships ...
0 CAD ... March 12 5
1 USA ... March 7 6
2 CAD ... March 4 9
3 CAD ... March 13 3
4 CAD ... April 4 13
5 USA ... April 2 11
6 CAD ... April 6 14
7 CAD ... April 9 7
... ... ... ... ... ...
有没有一种简单的方法可以在不拆分字符串条目的情况下做到这一点?我玩过,totaldf.unstack()
但由于有多个列,我不确定如何正确地重新索引数据框。
解决方案
如果将列转换为 MultiIndex,则可以使用堆栈:
In [11]: df1 = df.set_index("Hom")
In [12]: df1.columns = pd.MultiIndex.from_tuples(df1.columns.map(lambda x: tuple(x.split())))
In [13]: df1
Out[13]:
March April
Plans Ships Plans Ships
Hom
CAD 12 5 4 13
USA 7 6 2 11
CAD 4 9 6 14
CAD 13 3 9 7
In [14]: df1.stack(level=0)
Out[14]:
Plans Ships
Hom
CAD April 4 13
March 12 5
USA April 2 11
March 7 6
CAD April 6 14
March 4 9
April 9 7
March 13 3
In [21]: res = df1.stack(level=0)
In [22]: res.index.names = ["Hom", "Month"]
In [23]: res.reset_index()
Out[23]:
Hom Month Plans Ships
0 CAD April 4 13
1 CAD March 12 5
2 USA April 2 11
3 USA March 7 6
4 CAD April 6 14
5 CAD March 4 9
6 CAD April 9 7
7 CAD March 13 3
推荐阅读
- c# - 并行运行方法?
- python - PyQt5,点击QButton后如何打开新窗口
- html - HTML5 输入类型日期格式
- c++ - C++ Boost:对`boost::system::detail::system_category_ncx()`的未定义引用
- image - 如何在裁剪框生成的按键事件中保存裁剪的图像
- php - 如何在laravel 5.5中会话时自动重定向到登录页面
- regex - 正则表达式使用分隔符从输入中获取特定数据
- sql - 在函数 SQL 中强制转换之前指定字符串日期格式
- ios - 最少 8 个字符的密码的正则表达式,包括至少 3 个:大写字符、小写字符、数字和特殊字符
- android - 在运行时添加模糊效果