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