堆栈上的熊猫行为

时间:2018-05-21 12:52:17

标签: python pandas dataframe

假设我有

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()实现任何想法?

3 个答案:

答案 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