Объединение нескольких фреймов данных с объединением с пандами - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть два фрейма данных, упомянутых ниже.

кадр данных df1 состоит из столбца SaleDate в качестве столбца уникального ключа форма df1 имеет вид (12, 11)

2-й кадр данных, указанный ниже

кадр данных df2 состоит из SaleDate столбец в качестве столбца уникального ключа

Форма df2 имеет вид (2,19)

Но размерностькаждый фрейм данных отличается.

Как-то мне нужно объединить 2 фрейма данных на основе нового столбца [месяц-год], который можно получить из SaleDate, и добавить ту же цену мочевины для всего месяца соответствующего года.,

Ожидаемое упоминание ниже

Фрейм данных df3 состоит из ежемесячных ureaprice для каждого необработанного в фрейме данных Форма нового фрейма данных(13,11)

*** Фактический df1 состоит из 2 миллионов записей, а df2 состоит из 360 записей.

Я попытался объединить два фрейма данных с левым соединением, чтобы получить вывод выше,Но не смог этого добиться.

import pandas as pd # Import Pandas for data manipulation using dataframes

    df1['month_year']=pd.to_datetime(df1['SaleDate']).dt.to_period('M')
    df2['month_year'] = pd.to_datetime(df2['SaleDate']).dt.to_period('M')

df1 = pd.DataFrame({'Factory': ['MF0322','MF0657','MF0300','MF0790'], 
               'SaleDate': ['2013-02-07','2013-03-07','2013-06-07','2013-05-07']
               'month-year':['2013-02','2013-03','2013-06','2013-05']})

df2 = pd.DataFrame({'Price': ['398.17','425.63','398.13','363','343.33','325.13'], 
                   'Month': ['2013-01-01','2013-02-01','2013-03-01','2013-04-01','2013-05-01','2013-06-01']
                   'month-year':['2013-01','2013-02','2013-03','2013-04','2013-05','2013-06']})

Конечный фрейм данных

s1 = pd.merge(df1, df2, how='left', on=['month_year'])

Все значения, относящиеся к цене мочевины, равны "NaN".

Надеемся получить консультацию специалиста по этому вопросу.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Я скопировал ваш код, без month_year столбца:

df1 = pd.DataFrame({'Factory': ['MF0322','MF0657','MF0300','MF0790'],
    'SaleDate': ['2013-02-07','2013-03-07','2013-06-07','2013-05-07']})
df2 = pd.DataFrame({'Price': ['398.17','425.63','398.13','363','343.33','325.13'],
    'Month': ['2013-01-01','2013-02-01','2013-03-01','2013-04-01','2013-05-01',
    '2013-06-01']})

Затем я создал month_year столбец в обоих фреймах данных:

df1['month_year'] = pd.to_datetime(df1['SaleDate']).dt.to_period('M')
df2['month_year'] = pd.to_datetime(df2['Month']).dt.to_period('M')

ислил их:

s1 = pd.merge(df1, df2, how='left', on=['month_year'])

Когда я выполнил print(s1), я получил:

  Factory    SaleDate month_year   Price       Month
0  MF0322  2013-02-07    2013-02  425.63  2013-02-01
1  MF0657  2013-03-07    2013-03  398.13  2013-03-01
2  MF0300  2013-06-07    2013-06  325.13  2013-06-01
3  MF0790  2013-05-07    2013-05  343.33  2013-05-01

Как видите, столбец Price правильный, равен Price для соответствующего месяца(согласно SaleDate).

Так что в целом ваш код в порядке.

Проверьте другие источники ошибок.Например, во фрагменте кода:

  • сначала вы устанавливаете month_year в каждом фрейме данных,
  • , затем снова создаете оба фрейма данных, уничтожая предыдущее содержимое.

Скопируйте мой код (и больше ничего) и подтвердите, что он дает тот же результат.Может быть, источник вашей проблемы находится в каком-то другом месте?

Обратите внимание, что, например, у вашего df2 есть столбец Month, а не SaleDate.Может быть, это коренная причина?

0 голосов
/ 03 февраля 2019

Предполагая, что ваши SaleDate столбцы являются строковыми типами, вы можете просто сделать: df1['month_year'] = df1['SaleDate'].apply(lambda x: x[:7]) df2['month_year'] = df2['SaleDate'].apply(lambda x: x[:7])

И я думаю, что все остальное должно работать!

...