Мне нужно создать DataFrame или словарь.Если N = 3
(количество списков внутри другого списка), ожидаемый результат будет таким:
d = {
'xs0': [[7.0, 986.0], [17.0, 6.0], [7.0, 67.0]],
'ys0': [[79.0, 69.0], [179.0, 169.0], [729.0, 69.0]],
'xs1': [[17.0, 166.0], [17.0, 116.0], [17.0, 126.0]],
'ys1': [[179.0, 169.0], [179.0, 1169.0], [1729.0, 169.0]],
'xs2': [[27.0, 276.0], [27.0, 216.0], [27.0, 226.0]],
'ys2': [[279.0, 269.0], [279.0, 2619.0], [2579.0, 2569.0]]
}
Для этого я запрограммировал следующий код.Но мне нужно, чтобы этот код работал быстрее:
import numpy as np
import pandas as pd
df_dict = {
'X1': [1, 2, 3, 4, 5, 6, 7, 8, np.nan],
'Y1': [9, 29, 39, 49, np.nan, 69, 79, 89, 99],
'X2': [11, 12, 13, 14, 15, 16, 17, 18, np.nan],
'Y2': [119, 129, 139, 149, np.nan, 169, 179, 189, 199],
'X3': [21, 22, 23, 24, 25, 26, 27, 28, np.nan],
'Y3': [219, 229, 239, 249, np.nan, 269, 279, 289, 299],
'S': [123, 11, 123, 11, 123, 123, 123, 35, 123],
'C': [9, 8, 7, 6, 5, 4, 3, 2, 1],
'F': [1, 1, 1, 1, 2, 3, 3, 3, 3],
'OTHER': [10, 20, 30, 40, 50, 60, 70, 80, 90],
}
bigger_df = pd.DataFrame(df_dict)
plots = [
{ 'x': 'X1', 'y': 'Y1', },
{ 'x': 'X2', 'y': 'Y2', },
{ 'x': 'X3', 'y': 'Y3', }
]
N = 3
d = {}
s_list = [123, 145, 35]
n = 0
for p in plots:
# INITIALIZATES THE DICTIONARY ELEMENTS
d['xs{}'.format(n)] = [[] for x in range(N)]
d['ys{}'.format(n)] = [[] for x in range(N)]
# BUILDS THE LISTS FOR THOSE ELEMENTS
for index in range(3):
df = bigger_df.filter([p['x'], p['y'], 'S', 'F', 'C']) # selects the minimum of columns needed
df = df[df['F'].isin([2, 3, 4, 9]) & df[p['x']].notnull() & df[p['y']].notnull() & (df.S == s_list[index])]
df.sort_values(['C'], ascending=[True], inplace=True)
d['xs{}'.format(n)][index] = list(df[p['x']])
d['ys{}'.format(n)][index] = list(df[p['y']])
n += 1
print(d)
Мне интересно, если бы вместо построения словаря в цикле я мог бы сделать какой-нибудь трюк с пандами или numpy.Если результат - это информационный фрейм pandas, а не словарь, это тоже хорошо для меня или даже лучше, но я не буду, если это будет более эффективно.
Некоторые идеи?