Как объединить два неправильных фрейма данных в Python - PullRequest
0 голосов
/ 04 июня 2018

Итак, у меня есть два фрейма данных

В первом фрейме данных отображаются 4 проданных автомобиля в разные даты диапазона и количество проданных автомобилей

Во 2-м фрейме данных:некоторые автомобили имеют ремонт, поэтому они называются

df1:

     Cars     Range(Days)    Sold
  0   A          1-3            5
  1              4-7            23
  2              8-15           2
  3   B          4-7            4
  4              8-15           1
  5   C          1-3            5
  6   D          1-3            2
  7   E          1-3            9

и

df2:

     Car     Repair_Calls
0    A            2 
1    C            45
2    D            32
4    E            1

Я пытался

df1 ['Repair_Calls'] = df2 ['Repair_Calls']

Что я получил

     Car     Range(Days)    Sold     Repair_Calls
  0   A          1-3            5           2
  1              4-7            23          45
  2              8-15           2           32
  3   B          4-7            4           1
  4              8-15           1
  5   C          1-3            5           
  6   D          1-3            2           
  7   E          1-3            9            

Ожидаемый вывод

     Car     Range(Days)    Sold     Repair_Calls
  0   A          1-3            5           2
  1              4-7            23
  2              8-15           2
  3   B          4-7            4           0
  4              8-15           1
  5   C          1-3            5           45
  6   D          1-3            2           32
  7   E          1-3            9            1

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

@ san , вы можете попробовать следующий код:

Пожалуйста, прокомментируйте, если решение не удовлетворяет вашей проблеме с дополнительными входными данными и объяснением.

"Код

import pandas as pd
import numpy as np 

data_arr1 = [
    ['A', '1-3', 5],
    ['',  '4-7', 23],
    ['',  '8-15', 2],
    ['B', '4-7', 4],
    ['', '8-15', 1],
    ['C', '1-3', 5],
    ['D', '1-3', 2],
    ['E', '1-3', 9]
]
columns1 = ["Car", "Range(Days)", "Sold"];

data_arr2 = [
    ['A', 2],
    ['C', 45],
    ['D', 32],
    ['E', 1]
];
columns2 = ["Car", "Repair_Calls"];

# Creating DataFrames
df = pd.DataFrame(data_arr1, columns=columns1)
df2 = pd.DataFrame(data_arr2, columns=columns2)

# Printing Dataframes
print(df);
print('\n')
print(df2);

# Merging df & df2 to get desired output
df3 = pd.merge(left=df, right=df2, left_on="Car", right_on="Car", how="outer").replace(np.nan, "", regex=True)
print('\n')
print(df3)

Выход"

  Car Range(Days)  Sold
0   A         1-3     5
1             4-7    23
2            8-15     2
3   B         4-7     4
4            8-15     1
5   C         1-3     5
6   D         1-3     2
7   E         1-3     9


  Car  Repair_Calls
0   A             2
1   C            45
2   D            32
3   E             1


  Car Range(Days)  Sold Repair_Calls
0   A         1-3     5            2
1             4-7    23
2            8-15     2
3            8-15     1
4   B         4-7     4
5   C         1-3     5           45
6   D         1-3     2           32
7   E         1-3     9            1
0 голосов
/ 04 июня 2018

Используйте map от Series, созданного set_index с df2:

df1['Repair_Calls'] = df1['Cars'].map(df2.set_index('Car')['Repair_Calls'])

Или merge с left объединение:

df1 = df1.merge(df2, left_on='Cars',right_on='Car', how='left').drop('Car', axis=1)

print (df1)
  Cars Range(Days)  Sold  Repair_Calls
0    A         1-3     5           2.0
1  NaN         4-7    23           NaN
2  NaN        8-15     2           NaN
3    B         4-7     4           NaN
4  NaN        8-15     1           NaN
5    C         1-3     5          45.0
6    D         1-3     2          32.0
7    E         1-3     9           1.0

Но при необходимости также добавьте пропущенные значения, добавьте reindex уникальными значениями, отличными от NaN s:

s = df2.set_index('Car')['Repair_Calls'].reindex(df1['Cars'].dropna().unique(), fill_value=0)
df1['Repair_Calls'] = df1['Cars'].map(s)
print (df1)
  Cars Range(Days)  Sold  Repair_Calls
0    A         1-3     5           2.0
1  NaN         4-7    23           NaN
2  NaN        8-15     2           NaN
3    B         4-7     4           0.0
4  NaN        8-15     1           NaN
5    C         1-3     5          45.0
6    D         1-3     2          32.0
7    E         1-3     9           1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...