Объединение нескольких столбцов данных - PullRequest
2 голосов
/ 10 июля 2019

Я пытаюсь объединить 2 столбца фреймов данных в 1, но когда я пытаюсь сделать это на основе определенного размера, второй столбец фрейма данных не копируется правильно.

Я пробовалкод ниже, как вставлено ниже.

import pandas as pd
def readDataFile():
    fileName = "year.csv"
    dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
    dfY = pd.read_csv(fileName, parse_dates=['date'], date_parser=dateparse)

    fileName = "month.csv"
    dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
    dfM = pd.read_csv(fileName, parse_dates=['date'], date_parser=dateparse)


    newDF = pd.DataFrame()
    newDF['date_y'] = dfY['date']
    newDF['year_y_n'] = dfY['Y_N']
    newDF['date_m'] = dfM['date'][len(dfM) - len(dfY):len(dfM)]
    newDF['year_y_n'] = dfM['Y_N'][len(dfM) - len(dfY):len(dfM)]
    print newDF
readDataFile()

Файл: month.csv

date,Y_N
2018-03-14 04:00:00,N
2018-04-03 04:00:00,N
2018-05-31 04:00:00,Y
2018-06-14 04:00:00,N
2018-07-30 04:00:00,N
2018-08-31 04:00:00,Y
2018-09-28 04:00:00,N
2018-10-10 04:00:00,N
2018-11-07 04:00:00,Y
2018-12-31 04:00:00,N
2019-01-31 04:00:00,N
2019-02-05 04:00:00,Y
2019-03-29 04:00:00,N
2019-04-30 04:00:00,Y
2019-05-03 04:00:00,N
2019-06-03 04:00:00,Y

Файл: year.csv

date,Y_N
2014-05-23 04:00:00,Y
2015-12-21 04:00:00,N
2016-05-03 04:00:00,Y
2017-12-20 04:00:00,N
2018-06-14 04:00:00,N
2019-06-25 04:00:00,N

Это ТЕКУЩИЕ результаты:

date_y year_y_n date_m month_y_n
0 2014-05-23 04:00:00        Y    NaT       NaN
1 2015-12-21 04:00:00        N    NaT       NaN
2 2016-05-03 04:00:00        Y    NaT       NaN
3 2017-12-20 04:00:00        N    NaT       NaN
4 2018-06-14 04:00:00        N    NaT       NaN
5 2019-06-25 04:00:00        N    NaT       NaN

Ожидаемые результаты:

date_y              year_y_n    date_m              month_y_n
2014-05-23 04:00:00        Y  2019-01-31 04:00:00       N
2015-12-21 04:00:00        N  2019-02-05 04:00:00       Y
2016-05-03 04:00:00        Y  2019-03-29 04:00:00       N
2017-12-20 04:00:00        N  2019-04-30 04:00:00       Y
2018-06-14 04:00:00        N  2019-05-03 04:00:00       N
2019-06-25 04:00:00        N  2019-06-03 04:00:00       Y

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Проблема была связана с индексом. Если вы запустите код ниже:

newDF = pd.DataFrame()
newDF['date_y'] = dfY['date']
print(newDF)

Вы получите вывод:

     date_y
0 2014-05-23 04:00:00
1 2015-12-21 04:00:00
2 2016-05-03 04:00:00
3 2017-12-20 04:00:00
4 2018-06-14 04:00:00
5 2019-06-25 04:00:00

Индекс начинается с 0

И запустить это:

newDF = pd.DataFrame()
newDF['date_m'] = dfM['date'][len(dfM) - len(dfY):len(dfM)]
print(newDF)

Вы получите вывод:

    date_m
10 2019-01-31 04:00:00
11 2019-02-05 04:00:00
12 2019-03-29 04:00:00
13 2019-04-30 04:00:00
14 2019-05-03 04:00:00
15 2019-06-03 04:00:00

Здесь индекс начинается с 10

Итак, вам нужно сбросить индекс столбцов 'date' и 'Y_N' для dfM-фрейма данных, например:

def readDataFile():
    fileName = "year.csv"
    dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
    dfY = pd.read_csv(fileName, parse_dates=['date'], date_parser=dateparse)

    fileName = "month.csv"
    dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
    dfM = pd.read_csv(fileName, parse_dates=['date'], date_parser=dateparse)


    newDF = pd.DataFrame()
    newDF['date_y'] = dfY['date']
    newDF['year_y_n'] = dfY['Y_N']

    # Changes made on this line.
    newDF['date_m'] = dfM['date'][len(dfM) - len(dfY):len(dfM)].reset_index(drop=True)
    newDF['month_y_n'] = dfM['Y_N'][len(dfM) - len(dfY):len(dfM)].reset_index(drop=True)

    print(newDF)
readDataFile()

Выход:

date_y year_y_n              date_m month_y_n
0 2014-05-23 04:00:00        Y 2019-01-31 04:00:00         N
1 2015-12-21 04:00:00        N 2019-02-05 04:00:00         Y
2 2016-05-03 04:00:00        Y 2019-03-29 04:00:00         N
3 2017-12-20 04:00:00        N 2019-04-30 04:00:00         Y
4 2018-06-14 04:00:00        N 2019-05-03 04:00:00         N
5 2019-06-25 04:00:00        N 2019-06-03 04:00:00         Y
0 голосов
/ 10 июля 2019

Допустим, у вас есть произвольное количество фреймов данных dfA, dfB, dfC и т. Д. Вы хотите объединить их, но они имеют разные размеры.Наиболее простой подход заключается в их объединении:

df = pd.concat([dfA, dfB, dfC], axis=1)

Но если кадры данных имеют разные размеры, строки будут отсутствовать.Если вам все равно, какие строки сохраняются, вы можете просто отбросить строки с пропущенными значениями:

df.dropna()

Но если вы конкретно хотите использовать последние N строк каждого кадра данных,где N - длина самого маленького информационного кадра, вам нужно проделать немного больше работы.Но я подожду и посмотрю, если вы этого хотите.


Старый ответ:

Объединение может быть намного проще, чем это.Используйте pd.merge:

pd.merge(dfY, dfM[-len(dfY):].reset_index(), 
    suffixes=['_y', '_m'], left_index=True, right_index=True)
  • dfM[-len(dfY):] получает последние N строк dfM, где N это длина dfY.
  • .reset_index() заставляет индекс подмножества dfM начинаться с 0, поэтому он может корректно совпадать с dfY.
  • suffixes=['_y', '_m'] сохраняет имена столбцов различными.Вы можете переименовать их, если хотите.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...