Как объединить / объединить столбцы из нескольких файлов CSV в 1 DataFrame ()? - PullRequest
0 голосов
/ 30 марта 2020

Набор данных, который я использую: https://www.kaggle.com/rohanrao/nifty50-stock-market-data

Содержит данные фондового рынка всех компаний NIFTY50 с 2000 по 2020 год. Каждый файл содержит следующие столбцы: ['Date', 'Symbol', 'Series', 'Prev Close', 'Open', 'High', 'Low', 'Last', 'Close', 'VWAP', 'Volume', 'Turnover', 'Trades', 'Deliverable Volume', '%Deliverble']

Мне нужно скомпилировать столбцы 'Close' из всех файлов в один фрейм данных. С датой в качестве индекса и именем столбца в качестве имени файла, то есть

Date                       ADANIPORTS          ASIANPAINTS       AXISBANK .....
2000-01-01                     0               1500               300
2000-02-02                     1               1600               400
...     

В некоторых файлах есть данные только с более поздней даты (скажем, 01-01-2007), в случае пропущенных значений 'Close' он должен быть указан как 0, т. Е. 0 до даты, когда будут доступны данные.

В настоящее время я использую этот код.

df=pd.DataFrame()
for filename in filenames:
    file=dir+filename+'.csv'
    data = pd.read_csv(file,usecols=lambda x: x in ['Date', 'Close'])
    data.rename(columns = {'Close':filename}, inplace = True)
    data.set_index('Date',inplace=True)
    df.join(data, how='outer')

Возвращает (0,0) DataFrame-> df

, в противном случае я попытался

#Initialising df with GRASIM.csv, and then using join for the other dataframes
file01 = dir + "GRASIM" + '.csv'
df=pd.read_csv(file01,usecols=lambda x: x in ['Date', 'Close'])
df.rename(columns = {'Close':"GRASIM"}, inplace = True)
df.set_index('Date',inplace = True)

for filename in filenames:
    file=dir+filename+'.csv'
    data = pd.read_csv(file,usecols=lambda x: x in ['Date', 'Close'])
    data.rename(columns = {'Close':filename}, inplace = True)
    data.set_index('Date',inplace=True)
    df.join(data, how='outer')

Но это возвращает изначально инициализированный кадр данных, т. Е.

          GRASIM
Date              
2000-01-03  438.30
2000-01-04  437.15
...            ...

Другие столбцы не добавляются.

В чем проблема в этом?

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Мне не ясно, какой выход вы ищете. Во всяком случае, я объясню, что я сделал. Сначала я разархивировал файлы в папку Kaggle на моем C-drive, а затем изменил его на свой текущий каталог с помощью os.chdir() Затем я создал пустой список, куда мы позже добавим кадры данных для зацикливания и объединения данных .

Для l oop я прочитал данные и необходимые столбцы и переименовал столбцы в их имя файла без расширения с os.path.splitext. Далее я добавил в список, который я создал ранее. После этого все данные объединяются, и я заменяю NaN на ноль. Я также включил закомментированную строку - если вы измените имя столбца, вы можете проверить любой данный столбец.

import os
import pandas as pd
os.chdir('C:/Kaggle')
data_list=[]
for file in os.listdir():
    data=pd.read_csv(file, usecols=lambda x: x in ['Date', 'Close'])
    data.rename(columns = {'Close':data.rename(columns = {'Close':os.path.splitext(file)[0]}, inplace = True)}, inplace = True)
    data_list.append(data)
data = pd.concat(data_list, sort=False)
data = data.fillna(0)
# data = data.loc[data.ASIANPAINT !=0]
data
0 голосов
/ 30 марта 2020

Одним из способов решения этой проблемы является использование модуля zipfile в Python:

from zipfile import ZipFile

#initialize an empty dataframe
df = []
with ZipFile('nifty50-stock-market-data.zip') as myzip:
    #get the list of files in the zip
    for file in myzip.namelist():
        #read each file in the list
        with myzip.open(file) as myfile:
            #read the file with pandas
            #append filename to the dataframe
            #and add to the empty df dataframe
            #all columns r read in, since some files
            #do not have date or close columns
            df.append(pd.read_csv(myfile)
                      .assign(filename = myfile.name.split('.')[0])
                      )
         #concatenate everything and filter for the three relevant columns
         everything = pd.concat(df).filter(['Date','Close','filename'])

 everything.head()  

        Date     Close  filename
0   2007-11-27  962.90  ADANIPORTS
1   2007-11-28  893.90  ADANIPORTS
2   2007-11-29  884.20  ADANIPORTS
3   2007-11-30  921.55  ADANIPORTS
4   2007-12-03  969.30  ADANIPORTS 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...