Панды read_csv в нескольких DataFrames - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть некоторые данные в текстовом файле, которые я читаю в Панд.Упрощенная версия txt для чтения:

idx_level1|idx_level2|idx_level3|idx_level4|START_NODE|END_NODE|OtherData...
353386066294006|1142|2018-09-20T07:57:26Z|1|18260004567689|18260005575180|...
353386066294006|1142|2018-09-20T07:57:26Z|2|18260004567689|18260004240718|...
353386066294006|1142|2018-09-20T07:57:26Z|3|18260005359901|18260004567689|...
353386066294006|1142|2018-09-20T07:57:31Z|1|18260004567689|18260005575180|...
353386066294006|1142|2018-09-20T07:57:31Z|2|18260004567689|18260004240718|...
353386066294006|1142|2018-09-20T07:57:31Z|3|18260005359901|18260004567689|...
353386066294006|1142|2018-09-20T07:57:36Z|1|18260004567689|18260005575180|...
353386066294006|1142|2018-09-20T07:57:36Z|2|18260004567689|18260004240718|...
353386066294006|1142|2018-09-20T07:57:36Z|3|18260005359901|18260004567689|...
353386066736543|22|2018-04-17T07:08:23Z||||...
353386066736543|22|2018-04-17T07:08:24Z||||...
353386066736543|22|2018-04-17T07:08:25Z||||...
353386066736543|22|2018-04-17T07:08:26Z||||...
353386066736543|403|2018-07-02T16:55:07Z|1|18260004580350|18260005235340|...
353386066736543|403|2018-07-02T16:55:07Z|2|18260005235340|18260005141535|...
353386066736543|403|2018-07-02T16:55:07Z|3|18260005235340|18260005945439|...
353386066736543|403|2018-07-02T16:55:07Z|4|18260006215338|18260005235340|...
353386066736543|403|2018-07-02T16:55:07Z|5|18260004483352|18260005945439|...
353386066736543|403|2018-07-02T16:55:07Z|6|18260004283163|18260006215338|...
353386066736543|403|2018-07-02T16:55:01Z|1|18260004580350|18260005235340|...
353386066736543|403|2018-07-02T16:55:01Z|2|18260005235340|18260005141535|...
353386066736543|403|2018-07-02T16:55:01Z|3|18260005235340|18260005945439|...
353386066736543|403|2018-07-02T16:55:01Z|4|18260006215338|18260005235340|...
353386066736543|403|2018-07-02T16:55:01Z|5|18260004483352|18260005945439|...
353386066736543|403|2018-07-02T16:55:01Z|6|18260004283163|18260006215338|...

И код, который я использую для чтения, выглядит следующим образом:

mydata = pd.read_csv('/myloc/my_simple_data.txt', sep='|', 
 dtype={'idx_level1': 'int',
        'idx_level2': 'int',
        'idx_level3': 'str',
        'idx_level4': 'float',
        'START_NODE': 'str',
        'END_NODE': 'str',
        'OtherData...': 'str'},
parse_dates = ['idx_level3'],
index_col=['idx_level1','idx_level2','idx_level3','idx_level4'])

То, что я действительно хочу сделать, это иметь отдельныйПанели данных для каждого уникального значения idx_level1 & idx_level2.Таким образом, в вышеприведенном примере было бы 3 DataFrames, относящихся к idx_level1|idx_level2 значениям 353386066294006|1142, 353386066736543|22 & 353386066736543|403 соответственно.

Возможно ли прочитать текстовый файл, подобный этому, и вывести каждыйизменить idx_level2 на новый Pandas DataFrame, возможно, как часть какого-то цикла?В качестве альтернативы, какой самый эффективный способ разбить mydata на подмножества DataFrame, учитывая, что все, что я прочитал, говорит о том, что перебирать DataFrame неэффективно.

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Прочитайте ваш фрейм данных, как вы делаете в настоящее время, затем сгруппируйте и используйте понимание списка:

group = mydata.groupby(level=[0,1])
dfs = [group.get_group(x) for x in group.groups]

вы можете вызвать ваши фреймы данных, выполнив dfs[0] и так далее

0 голосов
/ 18 декабря 2018

Считайте таблицу как есть и используйте groupby, например:

data = pd.read_table('/myloc/my_simple_data.txt', sep='|')
groups = dict()
for group, subdf in data.groupby(data.columns[:2].tolist()):
    groups[group] = subdf

Теперь у вас есть все фреймы вложенных данных в словаре, ключи которых являются кортежем двух индексаторов(например: (353386066294006, 1142))

0 голосов
/ 18 декабря 2018

Чтобы конкретно обратиться к вашему последнему абзацу, вы можете создать подсказку dfs, основанную на уникальных значениях в столбце, используя что-то вроде:

import copy
dict = {}
cols = df[column].unique()

for value in col_values:
    key = 'df'+str(value)
    dict[key] = copy.deepcopy(df)
    dict[key] = dict[key][df[column] == value]
    dict[key].reset_index(inplace = True, drop = True)

, где column = idx_level2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...