Объединение нескольких панд. Фреймы данных с конкретными ограничениями - PullRequest
0 голосов
/ 12 мая 2018

Допустим, у меня есть 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 фрейма данных в один, содержащий всю не избыточную информацию. Это значит:

  1. если есть новый идентификатор, просто добавьте строку
  2. если есть новый столбец, добавьте столбец
  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)

что, вероятно, уже не очень хорошее решение.

Спасибо за любую помощь, как это осуществить!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...