#python #pandas #dataframe
Вопрос:
У меня есть словарь, ключи-это временные шаги, а значения-список строк, все значения временных шагов имеют одинаковую длину. Это могло бы быть лучше объяснить визуально:
У меня есть это:
и я хочу превратить это в: (и забросить в поплавок)
Как я могу это сделать в панд ?
Комментарии:
1. Привет, было бы более полезно, если бы вы могли предоставить пример необработанных данных, а не изображение
Ответ №1:
- учитывая, что вы предоставили данные в виде изображения, написали генератор для генерации образцов данных того же формата
- систематически расширяйтесь в фрейм данных
- создайте фрейм данных с помощью
json_normalize()
- перенесите его
explode()
встроенный списокpd.eval
встроенный кортеж- наконец, создайте столбцы из кортежа
- создайте фрейм данных с помощью
sample = {
f"{k:.5f}": [f"({x:.2f},{y:.2f},{z:.2f})" for x, y, z in np.random.uniform(1, 3, (7, 3))]
for k in np.random.uniform(0.5, 2, 3)
}
print(sample)
pd.json_normalize(sample).T.rename(columns={0: "vals"}).explode("vals").apply(
pd.eval
).loc[:, "vals"].apply(lambda a: pd.Series({"x": a[0], "y": a[1], "z": a[2]}))
примеры данных
{'1.28289': ['(2.12,1.34,1.68)', '(2.34,1.16,1.89)', '(2.93,2.14,1.52)', '(2.12,1.35,2.74)', '(1.83,1.09,1.01)', '(2.77,1.05,2.02)', '(1.71,1.02,2.65)'], '1.67372': ['(2.14,2.98,1.64)', '(1.20,1.08,1.22)', '(1.87,2.04,1.95)', '(2.70,1.81,2.10)', '(2.05,1.15,1.17)', '(2.69,1.70,1.00)', '(1.91,2.77,1.56)'], '1.68896': ['(1.35,1.59,2.51)', '(1.54,2.73,1.23)', '(2.05,2.99,1.61)', '(2.17,1.39,2.02)', '(1.23,1.88,1.78)', '(2.79,1.99,1.94)', '(2.16,1.18,2.21)']}
выход
x | y | z | |
---|---|---|---|
1.28289 | 2.12 | 1.34 | 1.68 |
1.28289 | 2.34 | 1.16 | 1.89 |
1.28289 | 2.93 | 2.14 | 1.52 |
1.28289 | 2.12 | 1.35 | 2.74 |
1.28289 | 1.83 | 1.09 | 1.01 |
1.28289 | 2.77 | 1.05 | 2.02 |
1.28289 | 1.71 | 1.02 | 2.65 |
1.67372 | 2.14 | 2.98 | 1.64 |
1.67372 | 1.2 | 1.08 | 1.22 |
1.67372 | 1.87 | 2.04 | 1.95 |
1.67372 | 2.7 | 1.81 | 2.1 |
1.67372 | 2.05 | 1.15 | 1.17 |
1.67372 | 2.69 | 1.7 | 1 |
1.67372 | 1.91 | 2.77 | 1.56 |
1.68896 | 1.35 | 1.59 | 2.51 |
1.68896 | 1.54 | 2.73 | 1.23 |
1.68896 | 2.05 | 2.99 | 1.61 |
1.68896 | 2.17 | 1.39 | 2.02 |
1.68896 | 1.23 | 1.88 | 1.78 |
1.68896 | 2.79 | 1.99 | 1.94 |
1.68896 | 2.16 | 1.18 | 2.21 |