#python #dataframe
#питон #фрейм данных
Вопрос:
Существует список диктов d
, в который x
встроен список, например,
d = [{"name":"Python", "x":[0,1,2,3,4,5]}, # x has 300 elements {"name":"C ", "x":[0,1,0,3,4,4]}, {"name":"Java","x":[0,4,5,6,1]}]
Я хочу преобразовать d
Dataframe
и автоматически добавлять столбцы для каждого элемента , x
чтобы имя добавленного столбца имело префикс «abc», например.,
df.columns = ["name", "abc0", "abc1", ..., "abc300"]
Я ищу эффективный способ, как d
и во многих диктантах . Когда я вручную добавил столбцы, Python говорит
PerformanceWarning: DataFrame is highly fragmented. This is usually the result of calling `frame.insert` many times, which has poor performance. Consider joining all columns at once using pd.concat(axis=1) instead. To get a de-fragmented frame, use `newframe = frame.copy()`
Ответ №1:
Вы ищете что-то подобное:
d = [{"name":"Python", "x":[0,1,2,3,4,5]}, # x has 300 elements {"name":"C ", "x":[0,1,0,3,4,4]}, {"name":"Java","x":[0,4,5,6,1]}] df = pd.DataFrame( { "name": record["name"], **{f"abc{i}": n for i, n in enumerate(record["x"])} } for record in d )
Результат для вашего образца:
name abc0 abc1 abc2 abc3 abc4 abc5 0 Python 0 1 2 3 4 5.0 1 C 0 1 0 3 4 4.0 2 Java 0 4 5 6 1 NaN
Комментарии:
1. Это очень элегантное решение, спасибо!
Ответ №2:
Вы можете взять все содержимое списка словарей и превратить его в список строк со следующим пониманием списка
column_names = [p['name'] str(p['x'][idx]) for p in d for idx in range(len(p['x']))]
для вашего примера вы получите
['Python0', 'Python1', 'Python2', 'Python3', 'Python4', 'Python5', 'C 0', 'C 1', 'C 0', 'C 3', 'C 4', 'C 4', 'Java0', 'Java4', 'Java5', 'Java6', 'Java1']
а затем вы можете создать пустой фрейм данных с
df = pandas.DataFrame(columns=column_names)
Ответ №3:
Я надеюсь, что это то, что вам нужно. Если это поможет, поднимите голос и примите ответ.
d = { "name": "abc", "x":[i for i in range(300)] # 300 elements } df = pd.DataFrame(d) df = df.T df.columns = [i str(idx) for idx, i in enumerate(df.iloc[0])] df.drop(index=df.index[0], axis=0, inplace=True) df Out[91]: abc0 abc1 abc2 abc3 abc4 abc5 abc6 abc7 abc8 abc9 ... abc290 abc291 abc292 x 0 1 2 3 4 5 6 7 8 9 ... 290 291 292 abc293 abc294 abc295 abc296 abc297 abc298 abc299 x 293 294 295 296 297 298 299 [1 rows x 300 columns]
Комментарии:
1. Спасибо. Если у d есть несколько диктов, как это сделать элегантным способом?
2. @Blade вы можете привести какой-нибудь примерный пример? Если нет, то трудно понять, что вы пытаетесь сделать.