У меня есть один начальный кадр данных df1:
df1 = pd.DataFrame(np.array([[1, 'B', 'C', 'D', 'E'], [2, 'B', 'C', 'D', 'E'], [3, 'B', 'C', 'D', 'E'], [4, 'B', 'C', 'D', 'E'], [5, 'B', 'C', 'D', 'E']]), columns=['a', 'b', 'c', 'd', 'e'])
a b c d e
0 1 B C D E
1 2 B C D E
2 3 B C D E
3 4 B C D E
4 5 B C D E
Затем я вычисляю некоторые новые параметры на основе значений столбца df1, создаю новый df2 и объединяюсь с df1 для имени столбца «a».
df2 = pd.DataFrame(np.array([[1, 'F', 'G'], [2, 'F', 'G']]), columns=['a', 'f', 'g'])
a f g
0 1 F G
1 2 F G
df1 = pd.merge(df1, df2, how='left', left_on=['a'], right_on = ['a'])
a b c d e f g
0 1 B C D E F G
1 2 B C D E F G
2 3 B C D E NaN NaN
3 4 B C D E NaN NaN
4 5 B C D E NaN NaN
Это прекрасно работает, но в другом событии цикла я создаю df3 с теми же столбцами, что и df2, но слияние в этом случае не работает, оно не учитывает, что те же столбцы уже есть в df1.
ВАЖНОЕ ЗАМЕЧАНИЕ : Это только для иллюстрации, добавляются тысячи новых информационных фреймов, по одному на шаг цикла.
df3 = pd.DataFrame(np.array([[3, 'F', 'G']]), columns=['a', 'f', 'g'])
a f g
0 3 F G
df1 = pd.merge(df1, df3, how='left', left_on=['a'], right_on = ['a'])
a b c d e f_x g_x f_y g_y
0 1 B C D E F G NaN NaN
1 2 B C D E F G NaN NaN
2 3 B C D E NaN NaN F G
3 4 B C D E NaN NaN NaN NaN
4 5 B C D E NaN NaN NaN NaN
Я только один, чтобы заполнить пропущенные пробелы, используя уже существующие столбцы. Этот подход создает новые столбцы (f_x, g_x, f_y, g_y)
.
Добавление и контакт также не работают, поскольку они повторяют информацию (повторяющиеся строки на «а»).
Какой-нибудь совет, как это решить? Окончательный результат после слияния df1
с df2
, а после с df3
должен быть:
a b c d e f g
0 1 B C D E F G
1 2 B C D E F G
2 3 B C D E F G
3 4 B C D E NaN NaN
4 5 B C D E NaN NaN
В конечном итоге все столбцы будут заполнены во время цикла, поэтому при первом добавлении (df2) будут добавлены новые столбцы, а с df3 и далее только новые данные для заполнения всего NaN. Цикл выглядит так:
df1 = pd.DataFrame(np.array([[1, 'B', 'C', 'D', 'E'], [2, 'B', 'C', 'D', 'E'], [3, 'B', 'C', 'D', 'E'], [4, 'B', 'C', 'D', 'E'], [5, 'B', 'C', 'D', 'E']]), columns=['a', 'b', 'c', 'd', 'e'])
for num, item in enumerate(df1['a']):
#compute df[num] (based on values on df1)
df1 = pd.merge(df1, df[num], how='left', left_on=['a'], right_on = ['a'])