考虑到所有的列都共享一个pd.wide_to_long()模式,我正在尝试从宽到长地通过string+year实现数据访问。但是,我想知道是否有一种方法可以直接使用索引列(如pd.wide_to_long(df, ["A", "B"], i = df.index, j = "year").reset_index() )来执行一行。我试过了,但它似乎不接受这种做法。有办法吗?
df = pd.DataFrame({"cid" : {0 : "cd1", 1 : "cd2", 2 : "cd3"},
"A1970" : {0 : 3.2, 1 : 3.5, 2 : .4},
"A1980" : {0 : 3.1, 1 : 3.6, 2 : .5},
"B1970" : {0 : 2.5, 1 : 1.2, 2 : .7},
"B1980" : {0 : 3.2, 1 : 1.3, 2 : .1}
})
df = df.set_index(['cid'])
A1970 A1980 B1970 B1980
cid
cd1 3.2 3.1 2.5 3.2
cd2 3.5 3.6 1.2 1.3
cd3 0.4 0.5 0.7 0.1df['cid'] = df.index
pd.wide_to_long(df, ["A", "B"], i = 'cid', j = "year").reset_index()Expected output:
cid year A B
0 cd1 1970 3.2 2.5
1 cd2 1970 3.5 1.2
2 cd3 1970 0.4 0.7
3 cd1 1980 3.1 3.2
4 cd2 1980 3.6 1.3
5 cd3 1980 0.5 0.1发布于 2022-02-13 13:24:10
可以将索引重置在内部,以便wide_to_long看到已重新格式化的数据。您的索引已经有了一个名称,所以在重新检查时,它的列名变成了it ('cid'),我们将其放到i中。(默认情况下是'index')
# this is inside
pd.wide_to_long(df.reset_index(), ["A", "B"], i='cid', j="year").reset_index() cid year A B
0 cd1 1970 3.2 2.5
1 cd2 1970 3.5 1.2
2 cd3 1970 0.4 0.7
3 cd1 1980 3.1 3.2
4 cd2 1980 3.6 1.3
5 cd3 1980 0.5 0.1https://stackoverflow.com/questions/71101032
复制相似问题