Допустим, у меня есть 3 разных кадра данных панд
>>> import pandas as pd
>>> import numpy as np
>>>> df1 = pd.DataFrame({'ID': [20016, 50048, 13478, 68493, 57483],
'Sex': ['F', 'M', 'F', 'F', 'M'],
'Var1': [3, 3, 3, 3, 2],
'Var2': [2, 3, np.nan, 3, 2],
'Var3': [-0.25, 0, 4, np.nan, 0.14]})
>>> df1.set_index('ID')
Sex Var1 Var2 Var3
ID
20016 F 3 2.0 -0.25
50048 M 3 3.0 0.00
13478 F 3 NaN 4.00
68493 F 3 3.0 NaN
57483 M 2 2.0 0.14
2-й DF - это, по сути, обновленная версия DF1, что означает больше записей строк, а также других столбцов и, возможно, измененных значений в некоторых других столбцах, например,
>>>> df2 = pd.DataFrame({'PERSID': [20016, 50048, 13478, 68493, 57483, 45623],
'Sex': ['F', 'M', 'F', 'F', 'M', 'M'],
'Var1': [3, *1*, 3, 3, 2, np.nan],
'Var2': [*3*, 3, np.nan, 3, 2, 0],
'Var3': [-0.25, 0, 4, np.nan, 0.14, 0.28]})
>>> df2.set_index('ID')
Sex Var1 Var2 Var3
PERSID
20016 F 3.0 3.0 -0.25
50048 M 1.0 3.0 0.00
13478 F 3.0 NaN 4.00
68493 F 3.0 3.0 NaN
57483 M 2.0 2.0 0.14
45623 M NaN 0.0 0.28
И последний dataFrame в качестве примера должен быть несколько другим, например:
SUBJECT Var4 Var5 Var6
200 1640.345 345.0 -0.250000
6700 14236.430 1713.0 -0.050735
6702 1345.400 NaN 0.034450
1330__201805 345.750 335.0 0.140000
4786__201805 NaN 0.0 NaN
И цель состоит в том, чтобы объединить все 3 фрейма данных в один, содержащий всю не избыточную информацию. Это значит:
- если есть новый идентификатор, просто добавьте строку
- если есть новый столбец, добавьте столбец
- если есть точные идентификаторы в двух разных DF, их необходимо объединить таким образом, чтобы, если содержимое ячейки было одинаковым, содержимым 2-го DF можно было пренебречь. Однако если содержимое ячейки отличается, необходимо добавить новый столбец с columnName.y, а другой столбец необходимо переименовать в columnName.x
, учитывая только слияние DF1 и DF2, должно выглядеть примерно так:
ID Sex_x Var1_x Var2_x Var3 Var1_y Var2_y
20016 F 3.0 2.0 -0.25 NaN 3.0
50048 M 3.0 3.0 0.00 1.0 NaN
13478 F 3.0 NaN 4.00 NaN NaN
68493 F 3.0 3.0 NaN NaN NaN
57483 M 2.0 2.0 0.14 NaN NaN
45623 M NaN NaN 0.28 NaN 0.0
Затем следует также объединить 3-й DF, что приведет к добавлению только строк и столбцов.
Все клетки, которых нет в других DF, должны быть заполнены NaN
и было бы замечательно, если бы соответствующие столбцы, такие как name.x и name.y, были бы рядом друг с другом для обеспечения читабельности.
Я пробовал такие вещи, как pandas.DataFrame. (Объединять, объединять и объединять), пытаясь сделать это вручную, но ничего не работает, как должно быть.
Это пример того, как я делал добавление столбцов, если их нет:
df_combined = df_1.copy()
for ind, column in enumerate(df_2):
if not column in list(df_combined):
df_combined.insert(len(df_combined.columns), column,
value=pd.Series(np.nan),
allow_duplicates=False)
frame = [df_combined, df_2]
df_combined = pd.concat(frame)
что, вероятно, уже не очень хорошее решение.
Спасибо за любую помощь, как это осуществить!