Как объединить несколько фреймов данных в python

#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)
 

Это не сработало…Может кто-нибудь, пожалуйста, мне поможет

фрейм1 данных: введите описание изображения здесь

фрейм данных 2: введите описание изображения здесь

Фрейм данных 3: введите описание изображения здесь

Я использовал следующий запрос...фрейм данных 2 и фрейм данных 3 не отображается

выход: введите описание изображения здесь

Конечный результат после слияния

 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, столбцы=[‘идентификатор актива’,’идентификатор ревизии’]) Я отредактировал код, как показано ниже…пожалуйста, помогите мне