Python 熊猫从宽到长,带存根列表

Python 熊猫从宽到长,带存根列表,python,pandas,Python,Pandas,我目前拥有以下数据帧: 1_1 1_2 1_3 1_4 1_5 2_1 ... 9_5 10_1 10_2 10_3 10_4 10_5 0 0.049400 0.063812 0.097736 -0.077222 0.112779 -0.201620 ... 0.138246 0.015369 -0.083559 -0.186949 0.

我目前拥有以下数据帧:

        1_1       1_2       1_3       1_4       1_5       2_1  ...       9_5      10_1      10_2      10_3      10_4      10_5

0  0.049400  0.063812  0.097736 -0.077222  0.112779 -0.201620  ...  0.138246  0.015369 -0.083559 -0.186949  0.158505 -0.046787 
1 -0.169837  0.093606  0.043157  0.095289 -0.078525 -0.026500  ... -0.054344  0.008955  0.045036  0.198438  0.197416 -0.057831 
2 -0.192915  0.001477  0.077699  …
我想得到这样的东西:

cat     u       i       mouse       

0       1       1      0.049400 
1       1       1     -0.169837
2       1       1     -0.192915
0       1       2      0.063812
1       1       2      0.093606
2       1       2      0.001477
…
本质上,这些行表示cat列的值,下划线前的数字表示u列,下划线后的数字表示i列。最后,鼠标列是前面因素组合的值

但是,解决方案应该适用于这种格式的任何数据

到目前为止,考虑到我可以访问u(在本例中为1,2,3,4,5,6,7,8,9,10)和I(1,2,3,4,5)的列表,我有这个,但是解决方案应该适用于不同的列表和不同的行数

u_seq_stub = [u + '_' for u in u_seq] 
df = pd.wide_to_long(df, u_seq_stub, i='u', j='i').reset_index().rename(columns={'_':'u'})
但是,这不起作用,并抛出“KeyError:[Index(['userid'],dtype='object')]中没有一个在[columns]”中。。。我也咨询过,这似乎和我想要的没有什么不同,但肯定有什么我误解了

我提前感谢您的帮助。

将+与
expand=True一起使用
。要创建
cat
列,您可以使用:


使用
按所有列对
多索引进行拆分
,然后按重塑,按更改新列名称的级别,最后按以下方式将其转换为列:

您的解决方案应首先使用中的参数
sep
进行更改,然后通过一些数据清理进行另一次重塑:

u_seq_stub = ['1','2',...,'9','10']
#alternative
#u_seq_stub = [str(x) for x in range(1,11)]


df = (pd.wide_to_long(df.reset_index(), 
                     u_seq_stub, 
                     i='index', 
                     j='i', 
                     sep='_')
      .stack()
      .reset_index(name='mouse')
      .rename(columns={'index':'cat', 'level_2':'u'})
      .astype({'i':int, 'u':int})
      .sort_values(['u','i','cat'])
      )
print (df.head(10))
    cat  i  u     mouse
0     0  1  1  0.049400
12    1  1  1 -0.169837
24    2  1  1 -0.192915
3     0  2  1  0.063812
15    1  2  1  0.093606
25    2  2  1  0.001477
5     0  3  1  0.097736
17    1  3  1  0.043157
26    2  3  1  0.077699
7     0  4  1 -0.077222

谢谢你的回复!有没有办法仍然包含cat列的值?这意味着最终结果总共有4列?除此之外,这是一个完美的解决方案是的,您可以使用
groupby.cumcount
。我已经更新了我的解决方案!我认为这是一个索引名称,从广度到广度是回答这个问题的正确方式:-)顺便说一句,这里是节日快乐感恩节:-)@WeNYoBen wau,也祝节日快乐;)
df.columns = df.columns.str.split('_', expand=True)
df = df.unstack().rename_axis(('u','i','cat')).reset_index(name='mouse')
print (df.head(10))
   u  i  cat     mouse
0  1  1    0  0.049400
1  1  1    1 -0.169837
2  1  1    2 -0.192915
3  1  2    0  0.063812
4  1  2    1  0.093606
5  1  2    2  0.001477
6  1  3    0  0.097736
7  1  3    1  0.043157
8  1  3    2  0.077699
9  1  4    0 -0.077222
u_seq_stub = ['1','2',...,'9','10']
#alternative
#u_seq_stub = [str(x) for x in range(1,11)]


df = (pd.wide_to_long(df.reset_index(), 
                     u_seq_stub, 
                     i='index', 
                     j='i', 
                     sep='_')
      .stack()
      .reset_index(name='mouse')
      .rename(columns={'index':'cat', 'level_2':'u'})
      .astype({'i':int, 'u':int})
      .sort_values(['u','i','cat'])
      )
print (df.head(10))
    cat  i  u     mouse
0     0  1  1  0.049400
12    1  1  1 -0.169837
24    2  1  1 -0.192915
3     0  2  1  0.063812
15    1  2  1  0.093606
25    2  2  1  0.001477
5     0  3  1  0.097736
17    1  3  1  0.043157
26    2  3  1  0.077699
7     0  4  1 -0.077222