Pandas: поворот кадра данных в одну строку на пользователя (группу) - PullRequest
0 голосов
/ 21 апреля 2020

Во-первых, это не дублирующий вопрос, я смотрел на подобные вопросы, но решения для этого примера не верны.

Вот упрощенный пример моего pandas кадра данных:

  User Category Frequency    Visit 1 Date_Time    Visit 2 Date_Time  \

0    A    alpha         1  2020-03-01 00:00:00                    -   

1    A     beta         2  2020-04-01 00:00:00  2020-06-01 00:00:00   

2    B    alpha         3  2020-06-01 00:00:00  2020-07-01 00:00:00   

3    B     beta         1  2020-07-01 00:00:00                    -   

4    B    gamma         3  2018-10-01 00:00:00  2019-06-01 00:00:00   

5    C    gamma         1  2019-08-01 00:00:00                    -   

6    C   indigo         1  2018-09-01 00:00:00                    -   



     Visit 3 Date_Time Visit 4 Date_Time  

0                    -          -  

1                    -          - 

2  2020-08-01 00:00:00          -  

3                    -          -             

4  2020-10-01 00:00:00          - 

5                    -          -        

6                    -          - 

Я хотел бы преобразовать этот фрейм данных так, чтобы он имел ровно одну строку на пользователя, как показано ниже. Важно отметить, что столбцы Visit Date_Time не являются фиксированными, код также должен работать, если, например, существует Visit 5 Date_Time.

  User  alpha_Frequency alpha_Visit 1 Date_Time alpha_Visit 2 Date_Time  \

0    A                1     2020-03-01 00:00:00                       -   

1    B                3     2020-06-01 00:00:00     2020-07-01 00:00:00   

2    C                0                       -                       -   



  alpha_Visit 3 Date_Time alpha_Visit 4 Date_Time  beta_Frequency  \

0                       -                       -               2   

1     2020-08-01 00:00:00                       -               1   

2                       -                       -               0   



  beta_Visit 1 Date_Time beta_Visit 2 Date_Time beta_Visit 3 Date_Time  \

0    2020-04-01 00:00:00    2020-06-01 00:00:00                      -   

1    2020-07-01 00:00:00                      -                      -   

2                      -                      -                      -   



            ...            gamma_Frequency  gamma_Visit 1 Date_Time  \

0           ...                          0                        -   

1           ...                          3      2018-10-01 00:00:00   

2           ...                          1      2019-08-01 00:00:00   



  gamma_Visit 2 Date_Time gamma_Visit 3 Date_Time gamma_Visit 4 Date_Time  \

0                       -                       -                       -   

1     2019-06-01 00:00:00     2020-10-01 00:00:00                       -   

2                       -                       -                       -   



  indigo_Frequency  indigo_Visit 1 Date_Time indigo_Visit 2 Date_Time  \

0                0                         -                        -   

1                0                         -                        -   

2                1       2018-09-01 00:00:00                        -   



  indigo_Visit 3 Date_Time indigo_Visit 4 Date_Time  

0                        -                        -  

1                        -                        -  

2                        -                        - 

По существу, он объединяет столбец Category с частотой и Посетите столбцы Date_Time, затем разверните.

Код ниже, который я пробовал, но он не совсем работает.

df.pivot_table(index='User', 
                     columns=df.groupby('Category').cumcount(),
                     aggfunc='first').sort_index(axis=1, level=1)

1 Ответ

1 голос
/ 22 апреля 2020

Этот код должен решить вашу проблему

import pandas as pd

# Example df
data = {'user': ['A', 'A', 'B', 'B', 'B', 'C', 'C'],
        'category':['a','b', 'a', 'b', 'g', 'g', 'i'],
        'freq': [1, 2, 3, 1, 3, 1, 2],
        'visit_1_date': ['2019-10-01', '2019-10-01', '2019-10-01', '2019-10-01', '2019-10-01', '2019-10-01', '2019-10-01']
        }
df = pd.DataFrame(data)

result = df.pivot(index='user', columns='category')
print(result.head())

# OUTPUT
         freq                visit_1_date                                    
category    a    b    g    i            a           b           g           i
user                                                                         
A         1.0  2.0  NaN  NaN   2019-10-01  2019-10-01         NaN         NaN
B         3.0  1.0  3.0  NaN   2019-10-01  2019-10-01  2019-10-01         NaN
C         NaN  NaN  1.0  2.0          NaN         NaN  2019-10-01  2019-10-01

Если вы попробуете тот же код, но с набором данных с большим количеством столбцов, таких как visit_2_date, ... , вы получите расширенные результаты.

data = {'user': ['A', 'A', 'B', 'B', 'B', 'C', 'C'],
        'category':['a','b', 'a', 'b', 'g', 'g', 'i'],
        'freq': [1, 2, 3, 1, 3, 1, 2],
        'visit_1_date': ['2019-10-01', '2019-10-01', '2019-10-01', '2019-10-01', '2019-10-01', '2019-10-01', '2019-10-01'],
        'visit_2_date': ['2019-10-01', '2019-10-01', '2019-10-01', '2019-10-01', '2019-10-01', '2019-10-01', '2019-10-01']
        }

df = pd.DataFrame(data)

result = df.pivot(index='user', columns='category')
print(result.head())

# OUTPUT
         freq                 ... visit_2_date                                    
category    a    b    g    i  ...            a           b           g           i
user                          ...                                                 
A         1.0  2.0  NaN  NaN  ...   2019-10-01  2019-10-01         NaN         NaN
B         3.0  1.0  3.0  NaN  ...   2019-10-01  2019-10-01  2019-10-01         NaN
C         NaN  NaN  1.0  2.0  ...          NaN         NaN  2019-10-01  2019-10-01

В основном, когда мы поворачиваемся, используя user в качестве параметра индекса, мы вынуждаем возвращать одну строку на пользователя. Если мы установим категорию в качестве параметра столбцов без указания параметра значений, функция будет использовать оставшиеся столбцы в качестве значений.

Для получения дополнительной информации см. Документацию

...