列名称中带有float的pandas wide_to_long

时间:2019-03-12 15:12:37

标签: python-3.x pandas

我可以将示例用于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 个答案:

答案 0 :(得分:3)

后缀的默认捕获组是'\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