假设我有
ID A1 B1 A2 B2
1 3 4 5 6
2 7 8 9 10
我想使用pandas stack并希望实现类似这样的东西
ID A B
1 3 4
1 5 6
2 7 8
2 9 10
但我得到的是
ID A B
1 3 4
2 7 8
1 5 6
2 9 10
这就是我正在使用的
df.stack().reset_index().
使用Stack可以实现这样的功能吗? pandas中的append()
方法执行此操作,但如果可能,我希望使用pandas
stack()
实现任何想法?
答案 0 :(得分:5)
您可以使用pd.wide_to_long
:
pd.wide_to_long(df, ['A','B'], 'ID', 'value', sep='', suffix='.+')\
.reset_index()\
.sort_values('ID')\
.drop('value', axis=1)
输出:
ID A B
0 1 3 4
2 1 5 6
1 2 7 8
3 2 9 10
答案 1 :(得分:3)
通过拆分现有列名来创建新的columns
对象。我们理所当然地认为我们有单个字母后跟一个数字。
d = df.set_index('ID')
d.columns = d.columns.map(tuple)
d.stack().reset_index('ID')
ID A B
1 1 3 4
2 1 5 6
1 2 7 8
2 2 9 10
单行
df.set_index('ID').rename(columns=tuple).stack().reset_index('ID')
更通用
d = df.set_index('ID')
s = d.columns.str
d.columns = [
s.extract('^(\D+)', expand=False),
s.extract('(\d+)$', expand=False)
]
d.stack().reset_index('ID')
答案 2 :(得分:2)
更感兴趣的方式
s.groupby(s.columns.str[0],axis=1).agg(lambda x : x.values.tolist()).stack().apply(pd.Series).unstack(0).T.reset_index(level=0,drop=True)
Out[90]:
A B
ID
1 3 4
2 7 8
1 5 6
2 9 10