繁体   English   中英

用 df2 中的值替换 df1 中的值,如果值被替换,则在新的 col 中分配代码

[英]Replace values in df1 with values in df2 and then assign code in new col if value was replaced

我有 df1 那是 1000+ 行和 62 列。 为简单起见,它看起来与此类似

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

我对如何做到这一点非常迷茫。 如果我使用 df.update 那么我将不知道哪些行或 cols 来更改代码 cols

我无法按 df1["SID"]==df2["SID"] 等进行过滤,因为我会收到错误“只能比较标记相同的系列对象”。

您可以先将代码 cols 添加到 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

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

df2 ColX构造Code_ColXconcatupdate (注意: 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM