Слияние и добавление данных с помощью Python Pandas [duplicate]

1

Я пытаюсь прочитать, объединить и добавить большое количество из 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

Я чувствую, что ответ смотрит мне в лицо, но я не вижу этого. Любая помощь будет оценена по достоинству.

Теги:
pandas

2 ответа

0
>>> 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
>>> 
0

Как я уже сказал в комментарии, проблема перезаписи возникает из-за использования 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, но в противном случае это то, что вы хотите

Ещё вопросы

Сообщество Overcoder
Наверх
Меню