我可以将示例用于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
谢谢您的帮助
答案 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