Я прочитал ответы, похожие на эти вопросы, но не нахожу такие, как решение моей цели. У меня есть большой csv
файл размером почти 150 МБ, имеющий следующую форму:
logs.csv:
id,lat,lon,days,mode
656001,41.163172,-8.5838214,42461.0046296296,3
656001,41.163237,-8.58381,42461.0046412037,3
656001,41.1632328,-8.5838378,42461.0046527778,3
656001,41.163234,-8.5838637,42461.0046643519,3
656001,41.1632204,-8.583885,42461.0046759259,3
.....
758001,39.9966599,-8.6113725,42461.4125578704,1
758001,39.9969224,-8.6111087,42461.4125694444,1
758001,39.9972031,-8.6108471,42461.4125810185,1
....
829000,40.6022533,-7.2600605,42461.6981944444,2
829000,40.6020222,-7.2601668,42461.6982060185,2
829000,40.6017725,-7.2602641,42461.6982175926,2
829000,40.6015003,-7.2603968,42461.6982291667,2
......
863025,41.1459056,-8.6131507,42461.7629050926,0
863025,41.1459103,-8.6131553,42461.7629166667,0
863025,41.1459149,-8.6131682,42461.7629282407,0
Затем я хочу загрузить эти данные как массив массивов, на id
, чтобы каждый из вложенных массивов имел четыре столбца: lat, lon, days, mode
в следующей форме:
[
[41.163172 -8.5838214 42461.0046296296 3]
[41.163237 -8.58381 42461.0046412037 3]
[41.1632328 -8.5838378 42461.0046527778 3]
...
[39.9966599 -8.6113725 42461.4125578704 1]
[39.9969224 -8.6111087 42461.4125694444 1]
.....
.....
[41.1459056 -8.6131507 42461.7629050926 0]
[41.1459103 -8.6131553 42461.7629166667 0]
[41.1459149 -8.6131682 42461.7629282407 0]
]
Сначала я загрузил эти данные как numpy ndarray
, например так:
my_data = np.genfromtxt('logs.csv', delimiter=',', skip_header=True)
my_data.shape
(22, 5)
Затем попытался обработать их дальше к желаемому выводу (на id
), однако это изменяет форму предполагаемого массива:
#group by id
unique_id = set(my_data[:,0])
unique_id
{656001.0, 758001.0, 829000.0, 863025.0}
grouped_data = np.array([my_data[my_data[:,0]== pvalue, 1:]
for pvalue in unique_id])
grouped_data.shape
(503,)
Но я хочу иметь форму вложенного массива, как я бы перебирал его элементы. Я ожидал что-то по форме (X,4)
Затем я пытаюсь использовать pandas dataframe
, поэтому:
data = pd.read_csv('logs.csv')
data.head()
id lat lon days mode
0 656001 41.163172 -8.583821 42461.004630 3
1 656001 41.163237 -8.583810 42461.004641 3
2 656001 41.163233 -8.583838 42461.004653 3
3 656001 41.163234 -8.583864 42461.004664 3
4 656001 41.163220 -8.583885 42461.004676 3
Очевидно, pandas не даст ожидаемого результата:
data.groupby('id').head()
id lat lon days mode
0 656001 41.163172 -8.583821 42461.004630 3
1 656001 41.163237 -8.583810 42461.004641 3
2 656001 41.163233 -8.583838 42461.004653 3
3 656001 41.163234 -8.583864 42461.004664 3
.....
Ни одна из моих попыток не могла привести к требуемому массиву массивов, как показано в начале. Как мне это сделать?