Я пытаюсь прочитать, объединить и добавить большое количество из CSV. Основы все работают правильно. Тем не менее, я переписываю свой результирующий набор и не смог его исправить.
Данные в обоих файлах очень просты:
# Small data set
A,B,C
1,2,101
3,4,102
9,10,103
# Large data set(used in chunk below)
A,B,C
1,2,1000
3,4,2000
9,10,3000
Образец кода
import pandas as pd
# Read CSVs
inventory_1 = pd.read_csv("file1.csv")
# Create new DF to hold the merge results
bucket = pd.DataFrame(columns=list("ABC"))
# Use chunk to read in the large file, merge and append the data
for chunk in pd.read_csv("file2.csv",chunksize=2):
chunk_merge = pd.merge(
inventory_1, chunk,
left_on=['A'],
right_on=['A'],
how='left')
result = bucket.append(chunk_merge)
print(result)
Что происходит, так это слияние будет корректно работать с данными в куске, но предыдущие результаты будут перезаписаны в результате. Итак, в приведенном выше примере я получаю:
# 1st Loop
A B B_x B_y C C_x C_y
0 1 NaN 2.0 2.0 NaN 1000.0 101.0
1 3 NaN 4.0 4.0 NaN 2000.0 102.0
2 9 NaN 10.0 NaN NaN 3000.0 NaN
# 2nd Loop
A B B_x B_y C C_x C_y
0 1 NaN 2.0 NaN NaN 1000.0 NaN
1 3 NaN 4.0 NaN NaN 2000.0 NaN
2 9 NaN 10.0 10.0 NaN 3000.0 103.0
Ответ мне нужен:
A B_x C_x B_y C_y
0 1 2 1000 2 101
1 3 4 2000 4 102
2 9 10 3000 10 103
Я чувствую, что ответ смотрит мне в лицо, но я не вижу этого. Любая помощь будет оценена по достоинству.
>>> df1=pd.DataFrame({'A': [1,3,9], 'B': [2,4,10], 'C': [101,102,103]})
>>> df2=pd.DataFrame({'A': [1,3,9], 'B': [2,4,10], 'C': [1000, 2000, 3000]})
>>>
>>> df2.merge(df1, on='A')
A B_x C_x B_y C_y
0 1 2 1000 2 101
1 3 4 2000 4 102
2 9 10 3000 10 103
>>>
Как я уже сказал в комментарии, проблема перезаписи возникает из-за использования append
на фреймворк так, как вы это делали, данные теряются при переназначении result
. С образцом, который вы даете, вы можете добавить chunk_merge в список в каждом цикле, а затем использовать pd.concat
.
inventory_1 = pd.read_csv("file1.csv")
list_to_concat = [] #empty list you will append with chunk_merge
for chunk in pd.read_csv("file2.csv",chunksize=2):
list_to_concat.append( pd.merge(
inventory_1, chunk,
on='A', #simple on as both column have the same name
how='inner')) # this will help for concat, if you want to keep left, then a dropna is necessary
result = pd.concat(list_to_concat) #add .dropna() if left above
С вашими данными я искусственно выделил ваш "большой набор данных" в df из 2 строк и еще один из 1 строки, чтобы воссоздать эту идею, и в конце я получаю:
result
Out[366]:
A B_x C_x B_y C_y
0 1 2 101 2 1000
1 3 4 102 4 2000
0 9 10 103 10 3000
Обратите внимание, что C_x и C_y являются обменом (B тоже, но вы не видите с вашими данными), поскольку вы сначала объединяетесь в inventory_1
, но в противном случае это то, что вы хотите