2015-09-09 3 views
0

Мой код захватывает несколько файлов csv из каталога и помещает все данные в созданный мной DataFrame и называется «df». Каждый CSV имеет тот же формат, но может быть разной длины, поэтому это то, что я хочу сделать:python, pandas и импортирование нескольких csv в dataframe

Я хочу иметь столбец в моем df (DataFrame), который записывает второй и последний кусочки данных в каждом csv Я тяну, прежде чем он переместится на следующий. Я изменил приведенный ниже результат, чтобы дать вам пример того, что я имею в виду. Предположим, что я называю этот столбец BeforeLast. Когда вы видите значение 0, это означает, что он не второй для последнего фрагмента данных в csv, который я вытащил, если вы видите значение 1, это означает, что он второй, чтобы последний кусок данных в CSV я вытащил.

Как я могу это сделать, поскольку Python втягивает каждый вызов csv?

import pandas as pd 
import glob 
import os 


path =r'X:\PublicFiles\TradingData\CSV\RealMarkets\Weekly\Futures\Contracts\Corn C' 
allFiles = glob.glob(path + "/*.csv") ##'*' means any file name can be grabbed 
df = pd.DataFrame() 
list_ = [] 

for file_ in allFiles: 
    names = ['Date', 'Open', 'High', 'Low', 'Close', 'Vol', 'OI'] 
    df = pd.read_csv(file_, index_col = None, names = names) 
    list_.append(df) 
frame = pd.concat(list_) 

Вот пример из моей текущей dataFrame (ДФ)

Date  Open High  Low Close Vol OI 
0 20141212 427.00 427.00 427.00 427.00 0 0 
1 20141219 429.00 429.00 424.00 424.00 0 0 
2 20141226 424.00 425.00 423.00 425.00 0 0 
3 20150102 422.75 422.75 417.50 417.50 0 0 

Это то, что я хочу

Date  Open High  Low Close Vol OI BeforeLast 
0 20141212 427.00 427.00 427.00 427.00 0 0 0 
1 20141219 429.00 429.00 424.00 424.00 0 0 0 
2 20141226 424.00 425.00 423.00 425.00 0 0 1 
3 20150102 422.75 422.75 417.50 417.50 0 0 0 (this is the last piece of data in this csv and now it moves on to the next) 
4 20141226 424.00 425.00 423.00 425.00 0 0 0 
5 20150102 422.75 422.75 417.50 417.50 0 0 0 
6 20141226 424.00 425.00 423.00 425.00 0 0 1 
7 20150102 422.75 422.75 417.50 417.50 0 0 0 

ответ

2

Попробуйте это. Вам не нужен список. Просто добавьте исходный фрейм данных.

.iloc [-2, -1] является вторым в последнюю строку, последняя колонка

Я добавил сброс индекса, как в моем тесте я столкнулся с повторяющимися индексами.

import pandas as pd 
import glob 
import os 


path =r'X:\PublicFiles\TradingData\CSV\RealMarkets\Weekly\Futures\Contracts\Corn C' 
allFiles = glob.glob(path + "/*.csv") ##'*' means any file name can be grabbed 
df = pd.DataFrame() 

for file_ in allFiles: 
    names = ['Date', 'Open', 'High', 'Low', 'Close', 'Vol', 'OI'] 
    df_temp = pd.read_csv(file_, index_col = None, names = names) 
    df_temp['beforelast'] = 0 
    df_temp.iloc[-2,-1] = 1 
    df = df.append(df_temp) 

df = df.reset_index(drop=True) 
+0

эй, это сработало отлично! Одна вещь, которую я заметил, заключалась в том, что мои столбцы перегруппировались в некоторые по-разному, любой быстрый способ вернуть их так же, как и мои [имена] заказаны? –

+0

try: df = df [names] – user3602063

+0

отлично поработал! –

0
df = pd.DataFrame({'a': np.zeros(5)}) 
df[-2:-1] = 1 
print df 

    a 
0 0 
1 0 
2 0 
3 1 
4 0 

Вы можете использовать это при создании каждого dataframe?

Пример в вашем коде:

for file_ in allFiles: 
    names = ['Date', 'Open', 'High', 'Low', 'Close', 'Vol', 'OI'] 
    df = pd.read_csv(file_, index_col = None, names = names) 
    before = np.zeros(len(df)) 
    before[-2] = 1 
    df['before'] = before 
    list_.append(df) 
frame = pd.concat(list_) 
+0

Хорошо, хотя это кажется полезным, как бы включить это в свой код при построении dataFrame? Может быть, включить эту часть в pd.read_csv (....? –

+0

Я добавил более простую версию с использованием массива numpy, а затем просто добавлю ее в df перед добавлением. –

0

Просто создайте список для отслеживания последнего столбца, когда вы строите dataframe:

import pandas as pd 

df = pd.DataFrame() 
newcol = [] 

for i in range(10): 
    # Load 10 files and get shape 
    # length = df.shape[0] 
    length = 10 
    c = [0 for i in range(length)] 
    c[-2] = 1 
    newcol += c 

df['BeforeLast'] = newcol 

print df 
+0

Не имеет значения, сколько у вас файлов. файл, просто отслеживайте, сколько времени он использовал в списке newcol.Когда у вас есть все ваши загруженные файлы, просто добавьте новый столбец в ваш полный фрейм данных – kezzos

Смежные вопросы