как объединить несколько уникальных идентификаторов - PullRequest
1 голос
/ 28 июня 2019

У меня есть данные, аналогичные приведенным ниже:

Id  Car     Code    ShowTime
1   Honda    A      10/18/2017 14:45
2   Honda    A      10/18/2017 17:10
3   Honda    C      10/18/2017 19:35
4   Toyota   B      10/18/2017 12:20
5   Toyota   B      10/18/2017 14:45

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

all_car_schedules = db.session.query(Schedules.id, Schedules.code,
                                      Car.carname, Schedules.showtime) \
                               .filter(Schedules.id == Car.id)

df = pd.read_sql(all_car_schedules.statement, db.session.bind)

df[['show_date', 'start_times', 'median']] = df.showtime.str.split(' ', expand=True)
df['start_times'] = df['start_times'] + df['median']
df.drop('screening', axis=1, inplace=True)
df.drop('median', axis=1, inplace=True)
df_grp = df.groupby(['id', 'code', 'carname'])
df_grp_time_stacked = df_grp['start_times'].apply(list).reset_index()
df_grp_time_stacked['start_times'] = df_grp_time_stacked['start_times'].apply(lambda x: x[0] if (len(x) == 1) else x)
return_to_dict = df_grp_time_stacked.to_dict(orient='records')

Код выше возвращает несколько строк, когда ожидаемый результат должен быть:

"data":{
        'id': '1',
        'schedule': {
            'car': 'Honda',
            'show_date': '10/18/2017',
            'time_available': [
                '14:45',
                '17:10',        
            ],
            'code': 'A'

        }
    },{
        'id': '3',
        'schedule': {
            'car': 'Honda',
            'show_date': '10/18/2017',
            'time_available': [
                '19:35'
            ],
            'code': 'C'
        }
    },{
        'id': '4',
        'schedule': {
            'car': 'Toyota',
            'show_date': '10/18/2017',
            'time_available': [
                '12:20',
                '14:45'
            ],
            'code': 'B'
        }
    }

Я также использую sqlite3 в качестве базы данных. Я не уверен, должно ли быть изменение в запросе. Пожалуйста, дайте мне знать ваши мысли и помогите мне в этом. Огромное спасибо. Я также использую sqlite3 в качестве базы данных.

1 Ответ

1 голос
/ 28 июня 2019

Вы можете использовать функцию groupby() в сочетании с опцией list:

df = pd.DataFrame({'Id' : [1,2,3,4,5], 'Car': ['Honda', 'Honda', 'Honda', 'Toyota', 'Toyota'],
                    'Code': ['A', 'A', 'B', 'C', 'C'], 'show date': ['10/18/2017', '10/18/2017',
                                                                     '10/18/2017', '10/18/2017', '10/18/2017'],
                   'start_times' : ['14:45', '17:10', '19:35', '12:20', '14:45']})

df.groupby(['Car', 'Code', 'show date'])['start_times'].apply(list)

Вывод:

                           start_times
Car    Code show date                 
Honda  A    10/18/2017  [14:45, 17:10]
       B    10/18/2017         [19:35]
Toyota C    10/18/2017  [12:20, 14:45]

Если вы хотите сохранить первый идентификаторВы должны добавить опцию 'first' в строку Id следующим образом:

df.groupby(['Car', 'Code', 'show date']).agg({'start_times' : list, 'Id' : 'first'})

# Output
                  start_times  Id
Car    Code show date                     
Honda  A    10/18/2017  [14:45, 17:10]   1
       B    10/18/2017         [19:35]   3
Toyota C    10/18/2017  [12:20, 14:45]   4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...