[英]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列进行更新。 这可以通过merge
和groupby
:
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_ColX
并concat
和update
(注意: 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.