Фрейм данных добавьте несколько столбцов из списка с созданным именем каждого столбца

#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 вы можете привести какой-нибудь примерный пример? Если нет, то трудно понять, что вы пытаетесь сделать.