python - 按名称将列组融合为目标列
问题描述
这个问题建立在Pandas 的基础上,将几组列按名称融合为多个目标列。但是,我的数据以一种令人讨厌的方式组织
import pandas as pd
df = pd.DataFrame([(101, 'a', 'b', 'c', 'd', 'e', 'f', 1, 2, 3, 4, 5, 6, 'aa', 'bb', 'cc', 'dd', 'ee', 'ff'),
(102,'g', 'h', 'i', 'j', 'k', 'l' , 7, 8, 9, 10, 11, 12, 'gg', 'hh', 'ii', 'jj', 'kk', 'll')],
columns=['id','a__1', 'a__2', 'a__3', 'a_1', 'a_2', 'a_3','b__1', 'b__2', 'b__3', 'b_1', 'b_2', 'b_3','c__1', 'c__2', 'c__3', 'c_1', 'c_2', 'c_3'])
df
数据框如下所示:
id a__1 a__2 a__3 a_1 a_2 a_3 b__1 b__2 b__3 b_1 b_2 b_3 c__1 c__2 \
0 101 a b c d e f 1 2 3 4 5 6 aa bb
1 102 g h i j k l 7 8 9 10 11 12 gg hh
c__3 c_1 c_2 c_3
0 cc dd ee ff
1 ii jj kk ll
正如您所看到的,并非所有分隔符都只是一个下划线,它们有时是两个下划线。
最后,我想按以下方式组织我的数据,注意 a__1 应该在 a_1 之前,依此类推:
id a b c
0 101 a 1 aa
1 101 b 2 bb
2 101 c 3 cc
3 101 d 4 dd
4 101 e 5 ee
5 101 f 6 ff
6 102 g 7 gg
7 102 h 8 hh
8 102 i 9 ii
9 102 j 10 jj
10 102 k 11 kk
11 102 l 12 ll
基本上我的问题是,有时我不是只有一个下划线,而是 2。现在这不适用于 pd.wide_to_long 函数,因为我无法将分隔符参数设置为“_”或“__”。我希望你能理解我的问题。
解决方案
你可以使用@Wen old favorite pd.wide_to_long
:
pd.wide_to_long(df,['a','b','c'],i='id',j='new',sep='_',suffix='.')\
.reset_index('new', drop=True)\
.sort_index()
输出:
a b c
id
101 a 1 aa
101 b 2 bb
101 c 3 cc
101 d 4 dd
101 e 5 ee
101 f 6 ff
102 g 7 gg
102 h 8 hh
102 i 9 ii
102 j 10 jj
102 k 11 kk
102 l 12 ll
推荐阅读
- javascript - 我正在尝试在控制台(js)中输入
- python - 如何删除被抓取数据的 p 标签
- javascript - 从另一个 HTML 页面填充网格中的元素
- python - Python Pandas Split/Trim 用.endswith() 删除字符串列末尾的字符?
- python - 艰难的 Python 谜语 - 三角形系列上的最低有效位隐写术
- cuda - 为什么我的矢量化访问内核这么慢?
- javascript - 如何使用 javascript 检查每个 Wtform RadioField 是否有值?
- django - 创建新对象而不是更新 - Django
- typescript - TypeScript 中的返回类型可以有条件地为空吗?
- python - 使用与实例无关的单独返回变量