大Pandas在松鼠上的行为

2024-10-03 23:27:08 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有

ID A1 B1  A2  B2
1  3  4   5   6
2  7  8   9   10

我想使用熊猫堆栈,并希望实现这样的东西

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中的{}方法可以做到这一点,但是如果可能的话,我想使用pandasstack()来实现,有什么想法吗?你知道吗


Tags: 方法功能ida2pandasdfindexstack
3条回答

您可以使用^{}

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

更有趣的方式

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

通过拆分现有列名来创建一个新的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')

相关问题 更多 >