Pandas Dataframe преобразуется со стеком и unstack - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь возиться со стеком панд и разложить стек.Мне было интересно, можно ли таким образом изменить мои данные.

Это мои примеры данных, которые я практикую.

ID,Value1,Value2
1,3,12
1,4,13
1,5,14
1,6,15
1,7,16
2,8,17
2,9,18
2,10,19
2,11,20

И я хочу изменить эту форму таким образом.

ID 
1   Index(Extra Column) Value1, value2
    1                      3    12
    2                      4    13
    3                      5    14
    4                      6    15
    5                      7    16

2
    1                      8    17
    2                      9    18
    3                      10   19
    4                      11   20

Я пробовал это

df1 = pd.DataFrame(df[['Value1', 'Value2']], index= df['ID']).stack()

или

df1 = df.set_index(['ID']).stack()

это меняет Value1 и Value2 со столбца на строки, которые мне не нужны.

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

В одну сторону от подачи

df.groupby('ID')[['Value1','Value2']].apply(lambda x : x.reset_index(drop=True))
Out[662]: 
      Value1  Value2
ID                  
1  0       3      12
   1       4      13
   2       5      14
   3       6      15
   4       7      16
2  0       8      17
   1       9      18
   2      10      19
   3      11      20
0 голосов
/ 10 июня 2018

defaultdict и count

from itertools import count
from collections import defaultdict

d = defaultdict(count)

df.set_index(['ID', np.array([next(d[x]) for x in df.ID])])

      Value1  Value2
ID                  
1  0       3      12
   1       4      13
   2       5      14
   3       6      15
   4       7      16
2  0       8      17
   1       9      18
   2      10      19
   3      11      20
0 голосов
/ 09 июня 2018

Я предлагаю set_index + cumcount здесь:

df.set_index(['ID', df.groupby('ID').cumcount() + 1])

      Value1  Value2
ID                  
1  1       3      12
   2       4      13
   3       5      14
   4       6      15
   5       7      16
2  1       8      17
   2       9      18
   3      10      19
   4      11      20

Другой вариант использует concat:

pd.concat({k : g.reset_index(drop=True) for k, g in df.drop('ID', 1).groupby(df.ID)})

     Value1  Value2
1 0       3      12
  1       4      13
  2       5      14
  3       6      15
  4       7      16
2 0       8      17
  1       9      18
  2      10      19
  3      11      20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...