2017-01-30 5 views
2

У меня есть файл с 1M строками, который я пытаюсь прочитать в 20 DataFrames. Я заранее не знаю, какая строка принадлежит DataFrame или насколько большой будет каждый DataFrame. Как я могу обработать этот файл в DataFrames эффективно? Я попытался сделать это несколькими разными способами. Вот что у меня есть:Pandas Dataframes: как эффективно их построить

data = pd.read_csv(r'train.data', sep=" ", header = None) # Not slow 
def collectData(row): 
    id = row[0] 
    df = dictionary[id] # Row content determines which dataframe this row belongs to 
    next = len(df.index) 
    df.loc[next] = row 
data.apply(collectData, axis=1) 

Это очень медленно. Что я делаю не так? Если я просто применил пустую функцию, мой код запускается через 30 секунд. С фактической функцией она занимает не менее 10 минут, и я не уверен, закончится ли она.

Вот несколько примеров строк из набора данных:

1 1 4 
1 2 2 
1 3 10 
1 4 4 

Полный набор данных доступен here (если вы нажмете на Matlab версии)

+0

могли бы вы уточнить следующее: 1), что 'data' выглядит как 2), что остальная часть строки' данных = pd.read ... '3), что делает исходный файл выглядите как (строки выборки) –

ответ

2

Ваш подход является не векторными один, потому что вы применяете функцию питона построчно.

Вместо того, чтобы создавать 20 фреймов данных, создайте словарь, содержащий индекс (в диапазоне (20)) для каждой клавиши [0]. Затем добавить эту информацию в DataFrame:

data['dict']=data[0].map(dictionary) 

Затем реорганизовать:

data2=data.reset_index().set_index(['dict','index']) 

data2, как:

  0 1 2 
dict index   
12 0  1 1 4 
    1  1 2 2 
    2  1 3 10 
    3  1 4 4 
    4  1 5 2 
    .... 

и data2.loc[i] является одним из Dataframe вы хотите.

EDIT:

кажется, что словарь описать train.label.

Вы можете установить словарь перед самим:

with open(r'train.label') as f: u=f.readlines() 
v=[int(x) for x in u] # len(v) = 11269 = data[0].max() 
dictionary=dict(zip(range(1,len(v)+1),v)) 
+0

Как вы на самом деле создаете словарь? Я пробовал варианты 'dict.fromkeys (range (20), data.ix [:, 0])', но я не могу найти допустимый синтаксис. –

+0

Я понял, что словарь был дан. Как вы хотите разделить данные? –

+0

В исходном коде у меня был словарь, где ключи были целыми числами, а значения были соответствующими фреймами данных. Я хочу разбить данные в соответствии с идентификатором, который мы получаем из строки [0]. –

2

Поскольку полный набор данных легко загружается в память следующее должно быть довольно быстро

data_split = {i: data[data[0] == i] for i in range(1, 21)} 
# to access each dataframe, do a dictionary lookup, i.e. 
data_split[2].head() 
    0 1 2 
769 2 12 4 
770 2 16 2 
771 2 23 4 
772 2 27 2 
773 2 29 6 

вы также можете сбросить индексы или скопировать кадр данных, когда вы нарезка кадр данных в к меньшим кадрам данных.

дополнительное чтение:

+0

таким образом вы получите доступ только к 0,17% данных, так как данные [0] могут принимать 11269 значений. –

+0

Я думаю, что этот ответ будет очень полезен для других людей, хотя он не решает проблему, которая у меня была. –

-3

Если вы хотите, чтобы эффективно строить их, я думаю, вам нужны хорошие виды сырья:

  • дерева
  • цемент

Прочные и прочные. Старайтесь избегать использования сена, поскольку блок данных может взорваться небольшим ветром.

Надежда, что помогает