Как объединить эти два набора данных? - PullRequest
0 голосов
/ 15 октября 2019

У меня есть два набора данных. Я хотел бы объединить с помощью индекса.

1-й набор данных:

index       A   B   C
01/01/2010  15  20  30
15/01/2010  12  15  25
17/02/2010  14  13  35
19/02/2010  11  10  22

2nt набор данных:

index  year  month     price
0      2010  january   70
1      2010  february  80

Я хочу, чтобы они были объединены как:

index       A   B   C   price
01/01/2010  15  20  30  70
15/01/2010  12  15  25  70
17/02/2010  14  13  35  80
19/02/2010  11  10  22  80

Проблема заключается в том, как использовать два столбца (year и month из 2-го набора данных) для создания временной даты-времени index.

Ответы [ 2 ]

2 голосов
/ 15 октября 2019

Попробуйте это, извлекая .month_name () и year (.dt.year) из df1 и объедините его с df2

>>> df1      
        index   A   B   C
0  01/01/2010  15  20  30
1  15/01/2010  12  15  25
2  17/02/2010  14  13  35
3  19/02/2010  11  10  22
>>> df2              
   index  year     month  price
0      0  2010   january     70
1      1  2010  february     80

# merging df1 and df2 by month and year.
>>> df1.merge(df2,
              left_on = [pd.to_datetime(df1['index']).dt.year,
                 pd.to_datetime(df1['index']).dt.month_name().str.lower()],
              right_on = ['year', 'month'])

Вывод:

      index_x   A   B   C  index_y  year     month  price
0  01/01/2010  15  20  30        0  2010   january     70
1  15/01/2010  12  15  25        0  2010   january     70
2  17/02/2010  14  13  35        1  2010  february     80
3  19/02/2010  11  10  22        1  2010  february     80
0 голосов
/ 15 октября 2019

вот глупый ответ! Я уверен, что вы можете сделать умнее, чем это :) Но это работает, учитывая, что ваши таблицы представляют собой список словарей (вы можете легко конвертировать таблицы SQL в этом формате). Я знаю, что это не чистое решение, но вы попросили простое, возможно, это самое простое для понимания:)

months = {'january': "01",
          'february': "02",
          'march': "03",
          'april':"04",
          'may': "05",
          'june': "06",
          'july': "07",
          'august': "08",
          'september': "09",
          'october': "10",
          'november': "11",
          'december': "12"}

table1 = [{'index': '01/01/2010', 'A': 15, 'B': 20, 'C': 30},
          {'index': '15/01/2010', 'A': 12, 'B': 15, 'C': 25},
          {'index': '17/02/2010', 'A': 14, 'B': 13, 'C': 35},
          {'index': '19/02/2010', 'A': 11, 'B': 10, 'C': 22}]

table2 = [{'index': 0, 'year': 2010, 'month': 'january', 'price':70},
          {'index': 1, 'year': 2010, 'month': 'february', 'price':80}]

def joiner(table1, table2):
    for row in table2:
        row['tempDate'] = "{0}/{1}".format(months[row['month']], str(row['year']))
    for row in table1:
        row['tempDate'] = row['index'][3:]

    table3 = []
    for row1 in table1:
        row3 = row1.copy()
        for row2 in table2:
            if row2['tempDate'] == row1['tempDate']:
                row3['price'] = row2['price']
                break
        table3.append(row3)
    return(table3)

table3 = joiner(table1, table2)
print(table3)
...