#python #python-3.x #pandas #dataframe
Вопрос:
У меня в коде 3 фрейма данных…мне нужно объединить все 3 в один фрейм данных и сохранить его в листе Excel. Прикрепил ниже 3 фрейма данных, и я хотел создать новый фрейм данных на основе asset_id.
Я попробовал, как показано ниже:
import pickle
import os
frames = [a_dataframe, pandaDf, pandaDf1]
result = pd.concat(frames)
Это не сработало…Может кто-нибудь, пожалуйста, мне поможет
Конечный результат после слияния
final_df=pandaDf.append(pandaDf1, sort=True).merge(a_dataframe, on='asset_id')
final_df
final_df=pandaDf.append(pandaDf1, sort=True).merge(a_dataframe, on='asset_id')
final_df
final_df.head(10).to_dict()
Комментарии:
1. зачем ты поставил
pyspark
метку ?
Ответ №1:
попробуйте это:
a_dataframe['property_name'] = a_dataframe['property_name'].astype(str)
pandaDf['property_name'] = pandaDf['property_name'].astype(str)
a_dataframe['property_value'] = a_dataframe['property_value'].astype(int)
pandaDf['property_value'] = pandaDf['property_value'].astype(int)
final_df = a_dataframe.merge(pandaDf, on='asset_id', how='left')
final_df = final_df.merge(pandaDf1, on='asset_id', how='left')
в одной строке вы можете попробовать это:
final_df = pandaDf1.merge(a_dataframe.merge(pandaDf,on='asset_id'),on='asset_id')
РЕДАКТИРОВАТЬ и добавлять код по запросу:
import pandas as pd
df1 = pd.DataFrame({'id': {0: 1, 1: 2, 2: 3, 3:4},
'p_value': {0: "HOR", 1: "HOR", 2: "HOR", 3:"HOR"}})
df2 = pd.DataFrame({'id': {0: 1, 1: 2, 2: 3, 3:4},
'p_value': {0: "GRAN", 1: "GRAN", 2: "GRAN", 3:"GRAN"}})
df3 = pd.DataFrame({'id': {0: 1, 1: 2, 2: 3, 3:4},
'r_id': {0: "24", 1: "32", 2: "42", 3:"45"}})
final_df = df3.merge(df1.merge(df2, on='id'),on='id')
final_df
выход:
id r_id p_value_x p_value_y
0 1 24 HOR GRAN
1 2 32 HOR GRAN
2 3 42 HOR GRAN
3 4 45 HOR GRAN
Комментарии:
1. @user1740577i использовали приведенный выше запрос… но фреймы данных не объединены.., пожалуйста, помогите мне
2. @Kanagambala, в чем твоя проблема?
3. можете ли вы отправить этот трехстрочный фрейм данных из трех строк
4. Я прикрепил вывод запроса.данный u..может ли u, пожалуйста, помочь mw
5. мне нужны такие столбцы, как asset_id, revision_id, Горизонт, Детализация
Ответ №2:
Вы можете добавить первые 2 кадра данных, а затем объединить 3-й кадр данных следующим образом:
final_df = df1.append(df2, sort=True).merge(df3, on='asset_id')
Результат:
print(final_df)
asset_id property_name property_value revision_id
0 1 HORIZON 24 314
1 1 GRANULARITY 24 314
2 2 HORIZON 48 12
3 2 GRANULARITY 24 12
4 3 HORIZON 24 24
5 3 GRANULARITY 24 24
6 4 HORIZON 24 43
7 4 GRANULARITY 48 43
Редактировать
Чтобы в дальнейшем сделать HORIZON
и GRANULARITY
как заголовки столбцов и поместить их property_value
под столбцы, вы можете сделать pivot
следующее:
final_df_pivoted = final_df.pivot(index=['asset_id', 'revision_id'], columns='property_name', values='property_value').rename_axis(columns=None).reset_index()
Результат:
print(final_df_pivoted)
asset_id revision_id GRANULARITY HORIZON
0 1 314 24 24
1 2 12 24 48
2 3 24 24 24
3 4 43 48 24
Комментарии:
1. `/ссылки на данные/python/библиотека/python3.7/пакеты сайтов/панды/ядро/фрейм.py:6211: Предупреждение о будущем: Сортировка, поскольку ось не-конкатенации не выровнена. Будущая версия pandas изменится на «не сортировать по умолчанию». Чтобы принять будущее поведение, передайте ‘sort=False’. Чтобы сохранить текущее поведение и отключить предупреждение, передайте ‘sort=True’. сортировать=сортировать)
2. я получаю вышеуказанную ошибку..можете ли вы, пожалуйста, помочь мне?
3. @Kanagambala Хорошо, дай мне взглянуть на это
4. @Kanagambala Отредактировал мое решение. Вы можете попробовать еще раз.
5. asset_id property_name_x property_value_x ревизион_id property_name_y property_value_y @SeaBean я получаю вывод, как указано выше
Ответ №3:
Ответ правильный, но неясно, что представляют собой ваши данные или как вы хотите объединить фреймы данных. В первом кадре данных «asset_id» 1 имеет «имя свойства» «ГОРИЗОНТ», но во втором кадре данных тот же «asset_id» имеет «имя свойства «»ДЕТАЛИЗАЦИЯ». Запутанным. И невозможно объединить фреймы данных красиво и логично.
Возможно, переименование столбцов с отличительными именами могло бы помочь дать полезные и полезные ответы.
Ответ №4:
Решение, приведенное выше пользователем 1740577, похоже, работает.
Я создал непосредственно три фрейма данных в python и попробовал приведенное решение, и оно сработало. вот мой код. Попробуйте проверить, работает ли он на вашей машине. Если это не так, это может быть способом загрузки ваших экселов во фрейм данных, что может вызвать ошибку.
import numpy as np
import pandas as pd
import IPython
df0 = pd.DataFrame(data=[[1, 'HORIZON', 24],
[2, 'HORIZON', 48],
[3, 'HORIZON', 24],
[4, 'HORIZON', 24]], columns=['asset_id', 'property_name', 'property_value'])
df1 = pd.DataFrame(data=[[3, 'GRANULARITY', 24],
[4, 'GRANULARITY', 48],
[1, 'GRANULARITY', 24],
[2, 'GRANULARITY', 24]], columns=['asset_id', 'property_name', 'property_value'])
df2 = pd.DataFrame(data=[[4, 24],
[2, 43],
[3, 314],
[1, 12]], columns=['asset_id','revision_id'])
print(df0)
print(df1)
print(df2)
final_df = df0.merge(df1, on='asset_id', how='left')
final_df = final_df.merge(df2, on='asset_id', how='left')
print(final_df)
IPython.embed()
Комментарии:
1. df0 = a_dataframe, столбцы=[‘идентификатор актива’, ‘имя свойства’, ‘значение свойства’]) df1 = pandaDf, столбцы=[‘идентификатор актива’, ‘имя свойства’, ‘значение свойства’]) df2 = pandaDf1, столбцы=[‘идентификатор актива’,’идентификатор ревизии’]) Я отредактировал код, как показано ниже…пожалуйста, помогите мне