Это двухэтапный подход.Во-первых, вам нужно выяснить, какие строки соответствуют какому условию.Затем, когда у вас есть свои условия и результаты, вы можете использовать маскировку и assign
, чтобы добавить серию в свой DataFrame.
c1 = book.B_UTYPE.eq("SCI")
c2 = book.B_UTYPE.eq("MAT")
s1 = book.B_ID.map(ucode.set_index('U_ID').U_CD)
s2 = book.B_ID.astype(str)
Теперь для забавной части:
parts = {
'U_ID': book.B_ID.mask(~c1),
'U_CD': pd.Series(s1).mask(~c1),
'N_COL1': s2.str[:3].mask(~c2),
'N_COL2': s2.str[3:].mask(~c2)
}
book.assign(**parts)
ID B_NAME B_AUTHOR B_PRICE B_UTYPE B_ID U_ID U_CD N_COL1 N_COL2
0 1 ABC aaa 12.21 SCI 182 182.0 9982825.0 NaN NaN
1 2 BCD bbb 98.00 ECN 920 NaN NaN NaN NaN
2 3 CDE ccc 22.34 SCI 228 228.0 9999983.0 NaN NaN
3 4 DEF ddd 44.11 LIT 761 NaN NaN NaN NaN
4 5 EFG eee 0.99 MAT 10242 NaN NaN 102 42
5 6 FGH fff 4.99 MAT 77721 NaN NaN 777 21
Настройка , поэтому вы можете воспроизвести:
book = pd.DataFrame({'ID': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6},
'B_NAME': {0: 'ABC', 1: 'BCD', 2: 'CDE', 3: 'DEF', 4: 'EFG', 5: 'FGH'},
'B_AUTHOR': {0: 'aaa', 1: 'bbb', 2: 'ccc', 3: 'ddd', 4: 'eee', 5: 'fff'},
'B_PRICE': {0: 12.21, 1: 98.0, 2: 22.34, 3: 44.11, 4: 0.99, 5: 4.99},
'B_UTYPE': {0: 'SCI', 1: 'ECN', 2: 'SCI', 3: 'LIT', 4: 'MAT', 5: 'MAT'},
'B_ID': {0: 182, 1: 920, 2: 228, 3: 761, 4: 10242, 5: 77721}})
ucode = pd.DataFrame({'U_ID': {0: 182, 1: 950, 2: 228, 3: 776, 4: 332},
'U_CD': {0: 9982825, 1: 9992822, 2: 9999983, 3: 9912876, 4: 9003931}})