объединение пустого «главного» df с несколькими динамически создаваемыми df, построенными из вложенных словарей

#python #pandas

Вопрос:

Привет, у меня есть следующий код. Я пытаюсь создать «главный» df, который содержит коллективную информацию из нескольких созданных df, созданных из вложенных словарей. Я попытался использовать преобразование dict в df, но это тоже сработало не так, как я хотел. Я также предпочел бы, чтобы имена столбцов создавались динамически, если это возможно.

 masterDf = pd.DataFrame(columns =["Sprinter"])

for key, value in sprintingTimesDict.items():
    Sprinter = key
    sprinterList.append(Sprinter )
    for distance, sprintStats in sprintingTimesDict[key].items():       
        distanceList.append(distance)
        time = sprintStats["time"]
        timeList.append(time)
        acceleration= sprintStats["acceleration"]
        accelerationList.append(acceleration).......


    df = pd.DataFrame(np.column_stack([sprinter,time, acceleration....]),columns =["sprinter", f"{distance}mtime", f"{distance}macceleration"....])
    print(df)
    masterDf = masterDf.merge(df,how='outer', left_on="Ticker")
 

печать(masterDf)

это своего рода пример отдельных dfs, созданных

 sprinter    100mtime    100macceleration    200mtime    200macceleration
x   10.5    0.75    21  0.90
sprinter    100mtime    100macceleration    200mtime    200macceleration
y   12.3    0.20    24.6    1.00
sprinter    100mtime    100macceleration    200mtime    200macceleration
z   9.83    0.63    19.66   0.30
 

Цель состоит в том, чтобы они слились в один df, как показано ниже.

 sprinter    100mtime    100macceleration    200mtime    200macceleration
x   10.5    0.75    21  0.90
y   12.3    0.20    24.6    1.00
z   9.83    0.63    19.66   0.30
 

В настоящее время мой код выдает следующий вывод:

 sprinter    100mtime    100macceleration    200mtime    200macceleration
x   10.5    0.75    21  0.90
y   12.3    NaN NaN NaN
y   NaN 0.20    NaN NaN
y   NaN NaN 24.6    NaN
y   NaN NaN NaN 0.30
z   9.83    NaN NaN NaN
z   NaN 0.63    NaN NaN
z   NaN NaN 19.66   NaN
z   NaN NaN NaN 0.30
 

Комментарии:

1. Вместо внешнего слияния на каждой итерации попробуйте создать список перед циклом for -> > master_df_list = [] в конце каждой итерации добавляйте df его в список -> > master_df_list.append(df) затем, после завершения цикла for, объедините список кадров данных вместе -> masterDf = pd.concat(master_df_list)

2. Это приводит к тому же результату

3. Однако немного неясно (учитывая, что образец sprintingTimesDict не был приведен), что, если каждая итерация создает фрейм данных с одной строкой, и ни одна из функций фрейма данных не используется df , почему вы не могли просто создать вложенный список или a dict для использования в качестве конструктора фрейма. Или даже создать кадр непосредственно из sprintingTimesDict

4. создайте минимальный рабочий код с примерами данных в коде — возможно, проблема в другом, чем вы думаете.

5. Привет!! Ваш вопрос решен? если это так, то попробуйте рассмотреть возможность принятия , чтобы сообщить другим, что проблема решена. Если нет, вы можете оставить отзыв, чтобы улучшить (или удалить)ответ

Ответ №1:

После слияния вы можете сделать:

 df=df.groupby('sprinter',as_index=False).sum()
 

или

Если существует несколько различных типов dtypes, вы можете это сделать:

 df=df.groupby('sprinter',as_index=False).first()
 

выход из df :

  sprinter   100mtime    100macceleration    200mtime    200macceleration
0   x       10.50       0.75                21.00           0.9
1   y       12.30       0.20                24.60           0.3
2   z       9.83        0.63                19.66           0.3