使用 Pandas 的 wide_to_long 函数时,如何处理列名中包含浮点数的情况?

5

我可以使用wide_to_long的示例,而且它能够正常工作。

df = pd.DataFrame({"A1970" : {0 : "a", 1 : "b", 2 : "c"}, 
                   "A1980" : {0 : "d", 1 : "e", 2 : "f"},
                   "B1970" : {0 : 2.5, 1 : 1.2, 2 : .7},
                   "B1980" : {0 : 3.2, 1 : 1.3, 2 : .1},
                   "X"     : dict(zip(range(3), np.random.randn(3)))})
df["id"] = df.index

df
   A1970 A1980  B1970  B1980         X  id
 0     a     d    2.5    3.2 -1.085631   0
 1     b     e    1.2    1.3  0.997345   1
 2     c     f    0.7    0.1  0.282978   2

pd.wide_to_long(df, ["A", "B"], i="id", j="year")

   id year
 0  1970 -1.085631  a  2.5
 1  1970  0.997345  b  1.2
 2  1970  0.282978  c  0.7
 0  1980 -1.085631  d  3.2
 1  1980  0.997345  e  1.3
 2  1980  0.282978  f  0.1

现在,我们需要修改列名称中的浮点数,如下所示:
df = pd.DataFrame({"A19.70" : {0 : "a", 1 : "b", 2 : "c"}, 
                   "A19.80" : {0 : "d", 1 : "e", 2 : "f"},
                   "B19.70" : {0 : 2.5, 1 : 1.2, 2 : .7},
                   "B19.80" : {0 : 3.2, 1 : 1.3, 2 : .1},
                   "X"     : dict(zip(range(3), np.random.randn(3)))})
df["id"] = df.index

df
   A19.70 A19.80  B19.70  B19.80         X  id
 0     a     d    2.5    3.2 -1.085631   0
 1     b     e    1.2    1.3  0.997345   1
 2     c     f    0.7    0.1  0.282978   2

我有一个空的DataFrame,代码如下:

pd.wide_to_long(df, ["A", "B"], i="id", j="year")

或者

pd.wide_to_long(df, ["A", "B"], i="id", j="year", suffix='\w')

有没有想法可以获取这个结果:

       id year
 0  19.70 -1.085631  a  2.5
 1  19.70  0.997345  b  1.2
 2  19.70  0.282978  c  0.7
 0  19.80 -1.085631  d  3.2
 1  19.80  0.997345  e  1.3
 2  19.80  0.282978  f  0.1

感谢您的帮助。
1个回答

6
默认的后缀捕获组为'\d+',它会按预期进行操作,但文档存在误导或用词不当:

'\d+'捕获数字后缀。

'(\d+)'不是捕获小数的正确捕获组,只能捕获整数后缀。
因此,您需要手动指定后缀捕获组。要么指定要抓取任何内容作为后缀,没有分隔符。或者在可能具有单个小数的数字情况下更安全地使用suffix='[0-9]+\.?([0-9]+)?',例如(19、19.、19.1231):
import pandas as pd

pd.wide_to_long(df, ["A", "B"], i="id", j="year", sep='', suffix='.*')

                X  A    B
id year                  
0  19.7 -1.182495  a  2.5
1  19.7  1.126017  b  1.2
2  19.7  0.871408  c  0.7
0  19.8 -1.182495  d  3.2
1  19.8  1.126017  e  1.3
2  19.8  0.871408  f  0.1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接