用df2中的值替换df1中的值,如果值被替换,则在新列中指定代码

2024-09-27 23:18:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有1000多行62列的df1。为简单起见,它看起来与此类似

SID  Run ID   TRE ID   Col1   Col2  Col3   Code_Col1   Code_Col2   Code_Col3 
001S  0919A   TRE001     1      2     3        0           0           0
002S  0919A   TRE002     4      5     6        0           0           0
001S  0919A   TRE001R    1      3     2        0           0           0
003S  1010A   TRE003     7      8     9        0           0           0

df2包含我需要在df1中替换的值

SID  Run ID   TRE ID   Col1   Col2  Col3
002S  0919A   TRE002   400     nan   600               
003S  1010A   TRE003   nan     nan   900          

如果值被替换,我需要将该列的代码更改为33。所以,我的最终df1应该是这样的

SID  Run ID   TRE ID   Col1   Col2  Col3   Code_Col1   Code_Col2   Code_Col3 
001S  0919A   TRE001     1      2     3        0           0           0
002S  0919A   TRE002    400     5    600      33           0          33
001S  0919A   TRE001R    1      3     2        0           0           0
003S  1010A   TRE003     7      8    900       0           0          33

我不知道该怎么做。如果我使用测向更新那我就不知道该把cols的代码改成什么行或列了

我无法按df1[“SID”]==df2[“SID”]等进行筛选,因为我将得到错误“只能比较相同标记的系列对象”。你知道吗


Tags: runidcodenancol2col3col1tre
3条回答

IIUC,你想根据三个ID列进行更新。这可以通过mergegroupby实现:

new_df = df.merge(df2, on=['SID','Run ID', 'TRE ID'],
        how='left', suffixes=['__x','__y'])

# update the code columns
code_cols = [col for col in new_df.columns if col[:4]=='Code']

new_df[code_cols] = new_df.filter(like='__y').notnull()*33

# groupby 
new_df.groupby([x.split('__')[0] for x in new_df.columns],
               sort=False,
              axis=1).last()

输出:

    SID Run ID   TRE ID   Col1  Col2   Col3  Code_Col1  Code_Col2  Code_Col3
0  001S  0919A   TRE001    1.0     2    3.0          0          0          0
1  002S  0919A   TRE002  400.0     5  600.0         33          0         33
2  001S  0919A  TRE001R    1.0     3    2.0          0          0          0
3  003S  1010A   TRE003    7.0     8  900.0          0          0         33

您可以首先将COL代码添加到df2数据帧,然后进行更新。你知道吗

import numpy as np
import pandas as pd

df1 = pd.DataFrame({'SID': {0: '001S', 1: '002S', 2: '001S', 3: '003S'}, 'Run ID': {0: '0919A', 1: '0919A', 2: '0919A', 3: '1010A'}, 'TRE ID': {0: 'TRE001', 1: 'TRE002', 2: 'TRE001R', 3: 'TRE003'}, 'Col1': {0: 1, 1: 4, 2: 1, 3: 7}, 'Col2': {0: 2, 1: 5, 2: 3, 3: 8}, 'Col3': {0: 3, 1: 6, 2: 2, 3: 9}, 'Code_Col1': {0: 0, 1: 0, 2: 0, 3: 0}, 'Code_Col2': {0: 0, 1: 0, 2: 0, 3: 0}, 'Code_Col3': {0: 0, 1: 0, 2: 0, 3: 0}})
df2 = pd.DataFrame({'SID': {0: '002S', 1: '003S'}, 'Run ID': {0: '0919A', 1: '1010A'}, 'TRE ID': {0: 'TRE002', 1: 'TRE003'}, 'Col1': {0: 400.0, 1: np.nan}, 'Col2': {0: np.nan, 1: np.nan}, 'Col3': {0: 600, 1: 900}})

df1.set_index(["SID", "Run ID", "TRE ID"], inplace=True)
df2.set_index(["SID", "Run ID", "TRE ID"], inplace=True)

df2.loc[df2.Col1.notna(), "Code_Col1"] = 33
df2.loc[df2.Col2.notna(), "Code_Col2"] = 33
df2.loc[df2.Col3.notna(), "Code_Col3"] = 33

df1.update(df2)

提供:

                      Col1  Col2   Col3  Code_Col1  Code_Col2  Code_Col3
SID  Run ID TRE ID                                                      
001S 0919A  TRE001     1.0     2    3.0        0.0          0        0.0
002S 0919A  TRE002   400.0     5  600.0       33.0          0       33.0
001S 0919A  TRE001R    1.0     3    2.0        0.0          0        0.0
003S 1010A  TRE003     7.0     8  900.0        0.0          0       33.0

df2concatupdateColX构造Code_ColX(注:X为数字)

i_cols = ["SID", "Run ID", "TRE ID"]
df1 = df1.set_index(i_cols)
df2 = df2.set_index(i_cols)

df2_Code = df2.notna().replace({True: 33, False: 0}).add_prefix('Code_')
df1.update(pd.concat([df2, df2_Code], axis=1))
df1 = df1.reset_index()

Out[160]:
    SID Run ID   TRE ID   Col1  Col2   Col3  Code_Col1  Code_Col2  Code_Col3
0  001S  0919A   TRE001    1.0     2    3.0        0.0        0.0        0.0
1  002S  0919A   TRE002  400.0     5  600.0       33.0        0.0       33.0
2  001S  0919A  TRE001R    1.0     3    2.0        0.0        0.0        0.0
3  003S  1010A   TRE003    7.0     8  900.0        0.0        0.0       33.0

相关问题 更多 >

    热门问题