объединение двух строк данных в одну строку с Python / Pandas - PullRequest
0 голосов
/ 06 октября 2019

У меня есть такой фрейм данных:

   ID   A1    A2    A3    A4                                      
0  01  100   101   103   104
1  01  501   502   503   504
2  01  701   702   703   704
3  02  1001  1002  1003  1004
4  03  2001  2002  2003  2004
5  03  5001  5002  5003  5004

Мне нужно, чтобы строки, принадлежащие одному и тому же идентификатору, были объединены в одну строку, объединенный фрейм данных будет выглядеть так:

   ID   A1    A2    A3    A4    B1    B2    B3     B4     C1   C2    C3    C4                                                   
0  01  101   102   103   104   501   502    503    504    701  702   703   704 
1  02  1001  2001  1003  1004  
2  03  2001  2002  2003  2004  5001  5002   5003   5004

Я пытался использовать np.random.permutation, np.roll и т. Д., Но не смог получить желаемый результат. Количество строк в моем исходном наборе данных исчисляется тысячами, поэтому циклы и создание отдельных наборов данных, а затем объединение не помогают

Ответы [ 2 ]

0 голосов
/ 06 октября 2019

Вот как вы это делаете:

import pandas as pd


def widen(x):
    num_rows = len(x)
    num_cols = len(x.columns)

    new_index = [
        chr(ord('A') + row_number) + str(col_number + 1)
        for row_number in range(num_rows)
        for col_number in range(num_cols)
    ]

    return pd.Series(x.loc[:, 'A1':].unstack().values, index=new_index)

res = df.groupby('ID').apply(widen).unstack()

Вывод будет:

        A1      A2      A3      A4      B1  ...      B4     C1     C2     C3     C4
ID                                          ...                                    
1    100.0   501.0   701.0   101.0   502.0  ...   503.0  703.0  104.0  504.0  704.0
2   1001.0  1002.0  1003.0  1004.0     NaN  ...     NaN    NaN    NaN    NaN    NaN
3   2001.0  5001.0  2002.0  5002.0  2003.0  ...  5004.0    NaN    NaN    NaN    NaN

предостережение : это будет работать только при условии, что каждый ID выиграл 'не более 26 строк.

0 голосов
/ 06 октября 2019

unstacked = df.unstack() дает вам первый шаг:

A1  0    1001
    1    5001
    2    7001
A2  0    1002
    1    5002
    2    7002
A3  0    1003
    1    5003
    2    7003
A4  0    1004
    1    5004
    2    7004

Затем вы можете извлечь два «уровня» индекса:

colname = unstacked.index.get_level_values(0) # A1,A1,A1,A2,...
rownum = unstacked.index.get_level_values(1) # 0,1,2,0,...

Затем преобразовать их в нужный формат:

idxchr = (rownum + ord('A')).map(chr) # A,B,C,A,...
idxnum = colname.str[1] # 1,1,1,2,...

И, наконец, перезаписать индекс без учета стека:

unstacked.index = idxchr + idxnum

Результат:

A1    1001
B1    5001
C1    7001
A2    1002
B2    5002
C2    7002
A3    1003
B3    5003
C3    7003
A4    1004
B4    5004
C4    7004

Редактировать: Вы редактировали свой вопрос, пока я писал этот ответ,теперь вам может понадобиться немного улучшить его, чтобы он работал с новым примером ввода, который вы опубликовали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...