#python #pandas #dataframe #csv
#python #pandas #фрейм данных #csv
Вопрос:
У меня есть 2 больших файла csv (в обоих около миллиона строк с разными именами столбцов, в одном файле около 70 столбцов). Я хочу выполнить левое соединение (подобное sql) с использованием python pandas и создать новый csv-файл с результатом.
Та же операция может быть выполнена с помощью sql с помощью приведенного ниже запроса —
select opportunities.* , data_dump.OpportunityID
from opportunities
left join data_dump on (opportunities.LeadIdentifier=data_dump.LeadId and opportunities.ProductSku=data_dump.ProductName)
Я думал сделать что-то подобное, но это очень неэффективно для таких больших данных-
fetched_opportunities = pd.read_csv(path "/data_dump.csv").fillna('')
data_obj = fetched_opportunities.to_dict(orient='records')
fetched_opportunities2 = pd.read_csv(path "/opportunities.csv").fillna('')
data_obj2 = fetched_opportunities2.to_dict(orient='records')
for opportunity_detail2 in data_obj:
for opportunity_detail1 in data_obj:
if opportunity_detail2['LeadIdentifier'] == opportunity_detail1['LeadId'] amp; opportunity_detail2['ProductSku'] == opportunity_detail1['ProductName']:
Ответ №1:
Попробуйте использовать merge
функцию следующим образом:
fetched_opportunities = pd.read_csv(path "/data_dump.csv").fillna('')
fetched_opportunities2 = pd.read_csv(path "/opportunities.csv").fillna('')
out=fetched_opportunities[["OpportunityID","LeadId","ProductName"]].merge(fetched_opportunities2,how='left',left_on=['LeadId','ProductName'],right_on=['LeadIdentifier','ProductSku']).drop(["LeadId","ProductName"],axis=1)
Комментарии:
1. Кроме того, как я могу убедиться, что новый csv содержит все столбцы из фрейма данных fetched_opportunities2 и только один столбец (OpportunityId) из фрейма данных fetched_opportunities, как мы получим из этого sql —
2. выберите opportunities.* , data_dump.OpportunityID из opportunities слева присоедините data_dump к (opportunities. LeadIdentifier=data_dump. leadID и возможности. ProductSku=data_dump. ProductName)