Python Pandas: группировка ключа: значение CSV импорта в строки - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть большой CSV-файл, который я хочу сгруппировать в строки. Это примерно миллион строк, каждая из которых будет сгруппирована в 10000 строк.

Каждая строка файла является либо комментарием, либо начинается с числа, за которым следует двоеточие, за которым следует значение, которое может содержать больше двоеточий.

Каждая строка, начинающаяся с 0:, указывает начало новой группы, в качестве последней строки также указывается 0:

Пример:

# comment line
# comment line
0:
1:HELLO
2:WORLD
3:1.0
4:5.0
5:TRUE
0:
2:HEY
6:1
7:12
# COMMENT LINE
0: 
1: FILE
3: 2.0
10: http://www.google.com
0:

Я читаю файл в DataFrame, как это. (Разделитель не идеален, но работает с данными, которые у меня есть)

df = pd.read_csv(FILENAME, 
                 sep='(?<=\d):', 
                 comment='#', 
                 names=['col', 'val'], 
                 engine='python')

В результате

    col val
0   0   
1   1   HELLO
2   2   WORLD
3   3   1.0
4   4   5.0
5   5   TRUE
6   0   
7   2   HEY
8   6   1
9   7   12
10  0   
11  1    FILE
12  3    2.0
13  10   http://www.google.com
14  0

Это должно быть преобразовано в

pd.DataFrame([
    {1: "HELLO", 2: "WORLD", 3: 1.0, 4: 5.0, 5: "TRUE"},
    {2: "HEY", 6: 1, 7: 12},
    {1: "FILE", 3: 2.0, 10: "http://www.google.com"}
])

который выглядит так

    1   2   3   4   5   6   7   10
0   HELLO   WORLD   1.0 5.0 TRUE            
1       HEY             1.0 12.0    
2   FILE        2.0                 http://www.google.com

Любые советы о том, как сделать эту группировку?

Могу ли я использовать c-engine read_csv, чтобы разделить строки по первому двоеточию, чтобы ускорить процесс?

1 Ответ

0 голосов
/ 18 сентября 2018

После прочтения данных CSV попробуйте следующее, чтобы получить желаемый результат:

new = pd.concat([df.loc[i].set_index('col').T for i in np.split(df.index, np.where(df.col==0)[0])[1:]]).reset_index()
new.columns = new.columns.rename('')
del new['index']
print(new)

Выход:

    0   1       2       3     4     5    6      7    10
0   NaN HELLO   WORLD   1.0   5.0   TRUE NaN    NaN  NaN
1   NaN NaN     HEY     NaN   NaN   NaN  1      12   NaN
2   NaN FILE    NaN     2.0   NaN   NaN  NaN    NaN  http://www.google.com

Обновление Это может быть незначительно быстрее, устраняя необходимость использования .loc

pd.concat([i.T for i in np.split(df.set_index('col'), np.where(df.col == 0)[0])[1:]]).reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...