2015-10-07 2 views
0

Учитывая следующие кадры данных:Python Панды Регистрация: Если один столбец не работает, попробуйте Другие

import pandas as pd 
df1 = pd.DataFrame({'Last':['Smith','Jones','Johnson'], 'First': ['Tom', 'Jim', 'Neil'], 'DOB':['1/1/2010', '3/1/2012', '4/3/2011'], 'ID': [1,2,3]}) 
df1 


    DOB  First ID Last 
0 1/1/2010 Tom 1 Smith 
1 3/1/2012 Jim 2 Jones 
2 4/3/2011 Neil 3 Johnson 

df2 = pd.DataFrame({'Last':['S','J','Johnson'], 'First': ['T', 'J', 'Neil'], 'DOB':['1/1/2010', '3/1/2012', '4/3/2011'],'ID': [1,2,5]}) 
df2 

    DOB First ID Last 
0 1/1/2010 T 1 S 
1 3/1/2012 J 2 J 
2 4/3/2011 Neil5 Johnson 

Я хотел бы присоединиться (слияние) их в панд следующим образом:

  1. Попробуйте объединить на ID = ID

  2. Где матчи не существует (т.е. для Neil Johnson),

a. Объединить фамилия, имя, DOB = Фамилия, Имя, DOB

ответ

2

Объединить ID

df3 = pd.merge(df1,df2,on='ID') 

слияния остальные записи на DOB, первый и последний

df4 = pd.merge(df1.drop(df3.index), df2.drop(df3.index), on = ['DOB','First','Last']) 

CONCAT оба типа слияний:

Я оставлю это для вас, вам нужно решить, как вы собираетесь сопоставлять свои столбцы.

+0

Спасибо! Я предполагаю, что если я хочу продолжать присоединяться к другим столбцам, если есть некоторые, которые не совпадают в Last, First, DOB, я бы продолжил шаблон выше (т.е. df5 = pd.merge (df1.drop (df4.index)), df3.drop (df4.index), on = [следующий столбец (ы) для использования для присоединения])? Что, если в следующий раз я хотел сопоставить идентификатор в df1 и новый столбец (не показано выше), называемый «ID2 "в df2? –

+0

Я наконец сел и понял ответ на мой следующий вопрос: df5 = pd.merge (df1.drop (df3.index & df4.index), df2.drop (df3.index & df4.index), left_on = 'ID', right_on = 'ID2') –

+0

Еще один вопрос: каким образом панды соответствуют индексам? –

1

относительно слияния:

Метод объединения принимают следующие параметры:

  • слева держать только ключи от первого dataframe
  • право: хранить только ключи от второго dataframe
  • внутренний: сохранить пересечение (это поведение по умолчанию)
  • внешний: удерживайте соединение (все) ключа

Так что, если вы хотите, пересечение:

merged = pd.merge(df1, df2, on "ID") #id is the key, df1 the first dataframe, df2 the second. 

это эквивалент:

merged = pd.merge(df1, df2, on "ID", how="inner") 

Что касается вашей точки «а» я лишу первую букву из «Последнего колонка» а затем объединить его с двумя другими.

df1['Last']=df1['Last'].str[:1] 
df2['Last']=df2['Last'].str[:1] 

и

df1["key"] = df1["Last"]+df1["First"]+df1["DOB"] 
df2["key"] = df2["Last"]+df2["First"]+df2["DOB"] 

, то я хотел бы использовать метод слияния:

merged = pd.merge(df1, df2, on "key", how="inner") 

print(merged) 
Смежные вопросы