несколько файлов объединяются в один фрейм данных — панды

#python #pandas #dataframe #merge

Вопрос:

У меня есть около 100 файлов .csv в папке с некоторыми фиктивными данными.
они называются как AA.csv, BB.csv, CC.csv…………………
Имя файла «AA», «BB», «CC» здесь являются символами. Каждый кадр данных будет иметь символ. Итак, здесь у нас есть 100 символов.

  Date           Open        High    Low          Close      Adj Close   Volume
2014-09-02  38.849998   38.990002   38.580002   38.740002   35.522366   6196200
2014-09-03  38.779999   38.965000   38.349998   38.395000   35.206020   6796800
2014-09-04  38.400002   38.685001   38.380001   38.580002   35.375645   5741000
 

Я хочу объединить 100 кадров данных в один кадр данных. Окончательный кадр данных будет содержать 101 столбец.
Столбец даты и один столбец для каждого из 100 символов, этот столбец будет содержать возвращаемое значение, которое мы вычисляем для этого символа. Я хочу объединить так, чтобы он содержал только пересечение дат между символами.

Я знаю, что мы можем использовать concat, прочитав каждый csv-файл и объединив их в один фрейм данных singal. Но я хочу сделать это с помощью «слияния». Возможно ли это? Как я могу это сделать?

Ответ №1:

Вы можете использовать pandas.merge для объединения данных на основе ключа «Дата». Поскольку вы можете захотеть объединить более двух кадров данных одновременно, вы можете использовать functools.reduce.

Допустим, данные, которые вы читаете из CSV-файлов, будут выглядеть следующим образом.

 import pandas as pd

df_1 = pd.DataFrame({
    "Date": ["2014-09-02", "2014-09-03", "2014-09-04"],
    "Open": [38.849998, 38.779999, 38.400002]
})

df_2 = pd.DataFrame({
    "Date": ["2014-09-02", "2014-09-03", "2014-09-04"],
    "High": [38.990002, 38.965000, 38.685001]
})

df_3 = pd.DataFrame({
    "Date": ["2014-09-02", "2014-09-03", "2014-09-04"],
    "Low": [38.580002, 38.349998, 38.380001]
})

dfs = [df_1, df_2, df_3]
 

Тогда вы сможете сделать:

 import pandas as pd
from functools import reduce

df = reduce(lambda left, right: pd.merge(left, right, on=['Date'],
                                     how='outer'), dfs)
 

df тогда будет:

          Date       Open       High        Low
0  2014-09-02  38.849998  38.990002  38.580002
1  2014-09-03  38.779999  38.965000  38.349998
2  2014-09-04  38.400002  38.685001  38.380001
 

Вы также должны прочитать документацию о параметре » как » в документации pandas.