Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Разбить CSV строку датафрейма по запятой и расположить в столбец

#python #pandas #машинное_обучение #numpy #dataframe


В общем задача такая, имеется датафрейм, содержащий данные вида:

Id  Sequence
3   1,3,13...
7   1,2,1,...
8   1,2,4,...
11  1,8,25...
13  1,111,..


Где id - номер последовательности, sequence - сама последовательность.
Задача, взять например первую последовательность и расположить его в столбец и так
со всеми. Количество элементов в последовательности везде разное.

Я делаю так:

#Импортируем необходимые пакеты
import sys
import warnings

import pandas as pd
import numpy as np
from sklearn.metrics import mean_absolute_error, mean_squared_error

import statsmodels.formula.api as smf
import statsmodels.tsa.api as smt
import statsmodels.api as sm
import scipy.stats as scs
from scipy.optimize import minimize

import matplotlib.pyplot as plt

#читаем данные и выводим
dftrain = pd.read_csv('../../data/IntegerSeqTrain.csv', sep=",", index_col=['Id'])
dftrain.head(10)


Выдаст: (то, что sequence выше id меня уже смущает)

   Sequence
Id  
3   1,3,13...
7   1,2,1,...
8   1,2,4,...
11  1,8,25...
13  1,111,...


Далее, собственно само разбиение

#для удобства пишем последовательности в столбец, предварительно разбив по запятой

print(dftrain.shape[1])
i=0
for dfitem in dftrain:
    j=0
    for dfitem2 in dfitem:
        dftrain[j] = dftrain['Sequence'].str.split(',').str.get(j)
        j+=1
    i+=1
#удаляем лишний столбец
dftrain = dftrain.drop('Sequence', 1)
#pd.set_option('max_colwidth', 10)
#что получилось
print(dftrain.head(10))


На выходе:

      0     1      2        3          4          5          6          7
Id                                                                       
3     1     3     13       87       1053      28576    2141733  508147108
7     1     2      1        5          5          1         11         16
8     1     2      4        5          8         10         16         20
11    1     8     25       83        274       2275     132224    1060067
13    1   111  12211  1343211  147753211  162528...  178781...  196659...
15    1     1      1        1          1          1          1          1
16  840  1320   1680     2520       3192       3432       4920       5208



Все записалось в строку, а не в столбец
Количество столбцов сильно сократилось (штук 8-9, хотя их на самом деле гораздо больше)


Как данные красиво разбить и представить в виде столбцов?) Спасибо заранее
Сами данные(train.csv): https://dropmefiles.com/osxrI

Исходник (IPYNB файл): https://dropmefiles.com/cIR4f
    


Ответы

Ответ 1



Решение: train = pd.read_csv(r'C:\download\train.csv', sep=",", index_col=['Id']) r = train.Sequence.str.split(',', expand=True).T Результат: In [203]: r Out[203]: Id 3 7 8 11 13 15 16 ... 227681 227682 227683 227684 227686 227689 227690 0 1 1 1 1 1 1 840 ... 7 1 0 0 0 2 5 1 3 2 2 8 111 1 1320 ... 7 0 0 -1 1 3 7 2 13 1 4 25 12211 1 1680 ... 3 1 4 -1 9 3 179 3 87 5 5 83 1343211 1 2520 ... 2 0 1198 -1 85 4 229 4 1053 5 8 274 147753211 1 3192 ... 3 0 1829388 -1 801 6 439 5 28576 1 10 2275 16252853211 1 3432 ... 9 0 23796035743 10324303 7549 4 557 6 2141733 11 16 132224 1787813853211 1 4920 ... 5 0 2142967506078650 -6586524273069171148 71145 5 6113 .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 341 None None None None None None None ... None None None None None None None 342 None None None None None None None ... None None None None None None None 343 None None None None None None None ... None None None None None None None 344 None None None None None None None ... None None None None None None None 345 None None None None None None None ... None None None None None None None 346 None None None None None None None ... None None None None None None None 347 None None None None None None None ... None None None None None None None [348 rows x 113845 columns] In [204]: r.columns Out[204]: Int64Index([ 3, 7, 8, 11, 13, 15, 16, 18, 20, 21, ... 227677, 227679, 227680, 227681, 227682, 227683, 227684, 227686, 227689, 227690], dtype='int64', name='Id', length=113845) In [205]: r.shape Out[205]: (348, 113845)

Комментариев нет:

Отправить комментарий