Привести в список списков по исходному DataFrame
Подскажите пожалуйста, как это делается красиво в стиле Pandas. Пока могу представить только с помощью страшных циклов. Исходные данные:
import pandas as pd
import numpy as np
from datetime import datetime
data= {'ID': {0: 308, 1: 308, 2: 309, 3: 309},
'LON': {0: 37.409936, 1: 37.409936, 2: 37.259936, 3: 37.259936},
'LAT': {0: 55.967077, 1: 55.967077, 2: 55.997077, 3: 55.997077},
'PERIOD_TIME': {0: datetime.strptime('2020-02-05 00:00:00', '%Y-%m-%d %H:%M:%S'),
1: datetime.strptime('2020-02-05 01:00:00', '%Y-%m-%d %H:%M:%S'),
2: datetime.strptime('2020-02-05 00:00:00', '%Y-%m-%d %H:%M:%S'),
3: datetime.strptime('2020-02-05 01:00:00', '%Y-%m-%d %H:%M:%S')},
'WEIGHT': {0: 0.1, 1: 0.9, 2: 0.4, 3: 0.5}}
df = pd.DataFrame(data)
df получается такого вида:
ID LON LAT PERIOD_TIME WEIGHT
0 308 37.409936 55.967077 2020-02-05 00:00:00 0.1
1 308 37.409936 55.967077 2020-02-05 01:00:00 0.9
2 309 37.259936 55.997077 2020-02-05 00:00:00 0.4
3 309 37.259936 55.997077 2020-02-05 01:00:00 0.5
Требуется создать отдельный список из уникальных PERIOD_TIME:
['2020-02-05 00:00:00', '2020-02-05 01:00:00']
И списки списков из данных [LON, LAT, WEIGHT]:
[[[37.409936, 55.967077, 0.1],[37.259936, 55.997077, 0.4]],
[[37.409936, 55.967077, 0.9],[37.259936, 55.997077, 0.5]]]
Ответы (2 шт):
Автор решения: MaxU
→ Ссылка
можно сделать так:
In [50]: res = df.groupby("PERIOD_TIME")["LON","LAT","WEIGHT"].apply(lambda x: x.values.tolist())
In [51]: res
Out[51]:
PERIOD_TIME
2020-02-05 00:00:00 [[37.409936, 55.967077, 0.1], [37.25...
2020-02-05 01:00:00 [[37.409936, 55.967077, 0.9], [37.25...
dtype: object
In [52]: res.iloc[0]
Out[52]: [[37.409936, 55.967077, 0.1], [37.259936, 55.997077, 0.4]]
или так:
res = (df
.assign(PERIOD_TIME=df["PERIOD_TIME"].astype(str))
.groupby("PERIOD_TIME")
["LON","LAT","WEIGHT"]
.apply(lambda x: x.values.tolist())
.to_dict())
In [58]: res
Out[58]:
{'2020-02-05 00:00:00': [[37.409936, 55.967077, 0.1],
[37.259936, 55.997077, 0.4]],
'2020-02-05 01:00:00': [[37.409936, 55.967077, 0.9],
[37.259936, 55.997077, 0.5]]}
Автор решения: MarianD
→ Ссылка
Для списка из уникальных PERIOD_TIME:
In[5]: lst = df["PERIOD_TIME"].drop_duplicates().to_list()
In[6]: lst
Out[6]: [Timestamp('2020-02-05 00:00:00'), Timestamp('2020-02-05 01:00:00')]
In[7]: [ts.strftime("%Y-%m-%d %H-%M-%S") for ts in lst]
Out[7]: ['2020-02-05 00-00-00', '2020-02-05 01-00-00']
Для списка списков из данных [LON, LAT, WEIGHT]:
In[8]: df1 = df[["LON", "LAT", "WEIGHT"]].T
In[9]: df1
Out[9]: 0 1 2 3 LON 37.409936 37.409936 37.259936 37.259936 LAT 55.967077 55.967077 55.997077 55.997077 WEIGHT 0.100000 0.900000 0.400000 0.500000
In[10]: [df1[i].to_list() for i in range(4)]
Out[10]: [[37.409936, 55.967077, 0.1], [37.409936, 55.967077, 0.9], [37.259936, 55.997077, 0.4], [37.259936, 55.997077, 0.5]]