Реализация cdc, но получение ошибки значения в Python Pandas - PullRequest
1 голос
/ 06 ноября 2019

Я пытаюсь выполнить операцию CDC через Python. Я пытаюсь выполнить объединение неизмененных данных (основной файл / базовая таблица) с новым файлом (дельта-файл).

Ниже приведена функция, которую я написал:

def processInputdata():
    df1 = pd.read_csv('master.csv')
    df2 = pd.read_csv('delta.csv')
    df=pd.merge(df1,df2,on=['cust_id','cust_id'],how="outer",indicator=True)
    dfo=df[df['_merge']=='left_only']
    dfT =pd.merge(dfo,df2,on=['cust_id','cust_id'],how="right",indicator=True)

Этоне работает. Ниже приведено сообщение об ошибке:

ValueError: Невозможно использовать имя существующего столбца для столбца индикатора

Я не уверен, существует ли какой-либо более простой или лучший подход для выполненияCDC.

Пример данных:

Основной файл:

   cust_id cust_name  cust_income cust_phone
0      111     a            78000       sony
1      222     b             8000        jio
2      333     c           108000     iphone
3      444     d           200000    iphoneX
4      555     e            20000    samsung

Дельта-файл:

 cust_id cust_name  cust_income cust_phone
0      222     b        20000          jio
1      333     c        120000     iphoneX
2      666     f        76000      oneplus

Ожидаемый результат:

   cust_id cust_name  cust_income cust_phone
0      111     a            78000       sony
1      222     b            20000        jio
2      333     c           120000     iphoneX
3      444     d           200000    iphoneX
4      555     e            20000    samsung
5.     666     f           76000     oneplus

Ответы [ 2 ]

3 голосов
/ 06 ноября 2019

Использование append с drop_duplicates с keep='last':

df = master.append(delta)\
           .drop_duplicates(subset=['cust_id','cust_phone'], keep='last')\
           .sort_values('cust_name').reset_index(drop=True)

   cust_id cust_name  cust_income cust_phone
0      111         a        78000       sony
1      222         b         8000        jio
2      333         c       108000    iphoneX
3      444         d       200000    iphoneX
4      555         e        20000    samsung
5      666         f        76000    oneplus
2 голосов
/ 06 ноября 2019

Использование DataFrame.merge + DataFrame.drop_duplicates:

new_df=( df_master.merge(df_delta,how='outer',sort=False)
                  .drop_duplicates(['cust_name','cust_phone'],keep='last')
                  .sort_values('cust_id')
                  .reset_index(drop=True) )
print(new_df)

   cust_id cust_name  cust_income cust_phone
0      111         a        78000       sony
1      222         b        20000        jio
2      333         c       120000    iphoneX
3      444         d       200000    iphoneX
4      555         e        20000    samsung
5      666         f        76000    oneplus

или pd.concat:

new_df=(pd.concat([df_master,df_delta],sort=False)
          .drop_duplicates(['cust_name','cust_phone'],keep='last')
          .sort_values('cust_id')
          .reset_index(drop=True) )
print(new_df)

   cust_id cust_name  cust_income cust_phone
0      111         a        78000       sony
1      222         b        20000        jio
2      333         c       120000    iphoneX
3      444         d       200000    iphoneX
4      555         e        20000    samsung
5      666         f        76000    oneplus
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...