2016-06-14 2 views
1

Последующие на этот пост: Merging two columns which don't overlap and create new columnsОбъединение двух или более столбцов, которые не перекрываются

import pandas as pd 

df1 = pd.DataFrame([["2014", "q2", 2], 
        ["2013", "q1", 1],], 
        columns=('Year', 'Quarter', 'Value')) 

df2 = pd.DataFrame([["2016", "q1", 3], 
        ["2015", "q1", 3]], 
        columns=('Year', 'Quarter', 'Value')) 


print(df1.merge(df2, on='Year', how='outer')) 

Результаты в:

Year Quarter_x Value_x Quarter_y Value_y 
0 2014  q2  2  NaN  NaN 
1 2013  q1  1  NaN  NaN 
2 2016  NaN  NaN  q1  3 
3 2015  NaN  NaN  q1  3 

Но я хочу, чтобы получить это:

Year Quarter Value 
0 2014  q2  2  
1 2013  q1  1  
2 2016  q1  3 
3 2015  q1  3 

Примечание: Это не дает желаемого результата ... :(

print(df1.merge(df2, on=['Year', 'Quarter','Value'], how='outer').dropna()) 

    Year Quarter Value 
0 2014  q2  2 
1 2013  q1  1 

... используя «левый» или правый или внутренний, также не разрезайте его.

ответ

2

Не уверен, что здесь происходит, но если я

df1.merge(df2, on=['Year', 'Quarter', 'Value'], how='outer').dropna() 

я получаю:

Year Quarter Value 
0 2014  q2 2.0 
1 2013  q1 1.0 
2 2016  q1 3.0 
3 2015  q1 3.0 

Вы можете посмотреть на merge, join & concat docs.

Самый «интуитивный» способ для этого, вероятно, .append():

df1.append(df2) 

    Year Quarter Value 
0 2014  q2 2.0 
1 2013  q1 1.0 
2 2016  q1 3.0 
3 2015  q1 3.0 

Если вы посмотрите исходный код, вы увидите, что вызывает concat за кулисами.

Merge полезный и предназначен для случаев, когда у вас есть columns с перекрывающимися значениями.

+0

Да, вы правы снова. Благодаря! –

2

pandas concat намного лучше подходит для этого.

pd.concat([df1, df2]).reset_index(drop=True) 

    Year Quarter Value 
0 2014  q2  2 
1 2013  q1  1 
2 2016  q1  3 
3 2015  q1  3 

concat предназначен для размещения одного dataframe прилегающего к другому, сохраняя при этом индексе или столбцы выровненным. В случае по умолчанию он выравнивает столбцы. Рассматривая ваши примерные кадры данных, столбцы выравниваются, и ваш заявленный ожидаемый результат показывает df2, помещенный точно после df1, где столбцы выровнены. Каждый аспект того, что вы просили, именно то, что было предложено для concat. Все, что я сделал, это указать на соответствующую функцию.

+0

Думаю, я читал это где-то еще, но вы можете уточнить? –

+0

сообщение отредактировано, чтобы отразить разработку. – piRSquared

+0

@Merlin правда достаточно ... редактирование сейчас. – piRSquared

1

Вы ищете функции дописывания:

df_final = df1.append(df2) 
Смежные вопросы