2016-01-08 2 views
0

Я пытаюсь преобразовать sql-запрос в python. SQL заявление выглядит следующим образом:Объединение в более чем 2 pandas dataframe

select * from table 1 
union 
select * from table 2 
union 
select * from table 3 
union 
select * from table 4 

Теперь у меня есть эти таблицы в 4 dataframe df1, df2, df3, df4, и я хотел бы союз 4 панд dataframe, который соответствовал бы результат такой же, как SQL-запроса. Я смущен, какая операция будет использоваться, что эквивалентно объединению sql? Спасибо заранее!

Примечание: Имя столбца для всех данных является одинаковым.

+0

Вы можете написать свой запрос с правильным синтаксисом и более подробно объяснить свой пример? – rdn87

+0

Добро пожаловать в 'Stack Overflow'. Вы можете проверить [тур] (http://stackoverflow.com/tour). – jezrael

ответ

4

Если я хорошо понимаю проблему, вы ищете функцию concat.

pandas.concat([df1, df2, df3, df4]) должен работать правильно, если имена столбцов одинаковы для обоих данных.

+0

Спасибо за синтаксис concat. Это сделало для меня работу – User1090

1

IIUC вы можете использовать merge и присоединиться к столбцами matching_col всех dataframes:

import pandas as pd 

# Merge multiple dataframes 
df1 = pd.DataFrame({"matching_col": pd.Series({1: 4, 2: 5, 3: 7}), 
        "a": pd.Series({1: 52, 2: 42, 3:7})}, columns=['matching_col','a']) 
print df1 
    matching_col a 
1    4 52 
2    5 42 
3    7 7 

df2 = pd.DataFrame({"matching_col": pd.Series({1: 2, 2: 7, 3: 8}), 
        "a": pd.Series({1: 62, 2: 28, 3:9})}, columns=['matching_col','a']) 
print df2 
    matching_col a 
1    2 62 
2    7 28 
3    8 9 

df3 = pd.DataFrame({"matching_col": pd.Series({1: 1, 2: 0, 3: 7}), 
        "a": pd.Series({1: 28, 2: 52, 3:3})}, columns=['matching_col','a']) 
print df3 
    matching_col a 
1    1 28 
2    0 52 
3    7 3 

df4 = pd.DataFrame({"matching_col": pd.Series({1: 4, 2: 9, 3: 7}), 
        "a": pd.Series({1: 27, 2: 24, 3:7})}, columns=['matching_col','a']) 
print df4 
    matching_col a 
1    4 27 
2    9 24 
3    7 7 

Solution1:

df = pd.merge(pd.merge(pd.merge(df1,df2,on='matching_col'),df3,on='matching_col'), df4, on='matching_col') 
set columns names 
df.columns = ['matching_col','a1','a2','a3','a4'] 
print df 

    matching_col a1 a2 a3 a4 
0    7 7 28 3 7 

Solution2:

dfs = [df1, df2, df3, df4] 
#use built-in python reduce 
df = reduce(lambda left,right: pd.merge(left,right,on='matching_col'), dfs) 
#set columns names 
df.columns = ['matching_col','a1','a2','a3','a4'] 
print df 

    matching_col a1 a2 a3 a4 
0    7 7 28 3 7 

Но если вам нужно только CONCAT dataframes, используйте concat с переустановку индексом параметром ignore_index=True:

print pd.concat([df1, df2, df3, df4], ignore_index=True) 

    matching_col a 
0    4 52 
1    5 42 
2    7 7 
3    2 62 
4    7 28 
5    8 9 
6    1 28 
7    0 52 
8    7 3 
9    4 27 
10    9 24 
11    7 7 
2

Это должно быть комментарий на ответ Jezrael (в + +1 для merge над concat), но у меня нет достаточной репутации ,

ОП спросил, как union ДФС, но merge возвращает intersection по умолчанию: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.merge.html#pandas.merge

Чтобы получить union с, добавьте how='outer' к merge вызовов.

Смежные вопросы