提问人:PineNuts0 提问时间:11/17/2023 最后编辑:PineNuts0 更新时间:11/17/2023 访问量:43
Python 数据帧:对于每行,从五个不同的列中选择一个值,并根据值是否在列表中放入新列
Python Dataframe: For Each Row Pick One Value from Five Different Columns And Place In New Column Based on if Value is in List
问:
假设我从下面的输入表开始:
日期 | 编号 | val1 | val2 | val3 | val4 | val5 | val_final |
---|---|---|---|---|---|---|---|
2023-08-29 | 货号 B3241 | 496C型 | |||||
2023-09-08 | 空客A3290 | 349C型 | 078楼 | 274楼 | |||
2023-09-12 | D2903型 | 349C型 | 072楼 | 307C型 | 160克 | 201D型 | |
2023-09-14 | 编号: I13490 | 497摄氏度 | 0349 | 303楼 | 101安培 |
创建初始输入表的代码如下:
import pandas as pd
df = pd.DataFrame({'date':["2023-08-29","2023-09-08","2023-09-12", "2023-09-14"],'id':["B3241","A3290","D2903", "I13490"],'val1':["496C","349C","349C", "497C"], 'val2':["","078F","072F", "0349"], 'val3':["","274F","307C", "303F"], 'val4':["","","170F", "101A"], 'val5':["","","201D",""]})
我想查看列“val1”到“val5”,并查看哪些行包含代码列表中的值。我想相应地填充“val_final”列(如果值在列表中)。
code_list = ['349C', '303F', '201D', '497C']
如果多个列包含来自code_list的值,我想选择最右边列中的一个。
根据上述逻辑,我想要的输出表将如下所示:
日期 | 编号 | val1 | val2 | val3 | val4 | val5 | val_final |
---|---|---|---|---|---|---|---|
2023-08-29 | 货号 B3241 | 496C型 | |||||
2023-09-08 | 空客A3290 | 349C型 | 078楼 | 274楼 | 349C型 | ||
2023-09-12 | D2903型 | 349C型 | 072楼 | 307C型 | 160克 | 201D型 | 201D型 |
2023-09-14 | 编号: I13490 | 497摄氏度 | 349C型 | 303楼 | 101安培 | 303楼 |
我搜索了整个 StackOverflow 试图解决这个问题,但无济于事。我假设执行 if then else 是一个选项,从列“val5”开始,一直到列“val1”,但我想学习一种更有效的方法来做到这一点。
答:
0赞
Suraj Shourie
11/17/2023
#1
IIUC 你可以将 apply 用于每一行,该函数返回code_list中存在的第一个值,从最右边的列开始:
# returns the first match
def lambda_func(row, code_list):
for x in row:
if x in code_list:
return x
return None
# define your list of "val" columns
val_cols = [x for x in df.columns if x.startswith('val')][::-1]
df['val_final'] = df.apply(lambda row: lambda_func(row[val_cols], code_list), axis=1)
print(df)
输出:
date id val1 val2 val3 val4 val5 val_final
0 2023-08-29 B3241 496C None
1 2023-09-08 A3290 349C 078F 274F 349C
2 2023-09-12 D2903 349C 072F 307C 170F 201D 201D
3 2023-09-14 I13490 497C 0349 303F 101A 303F
评论
df.apply(lambda row: row[row.isin(code_list)].values[-1] if row.isin(code_list).any() else None, axis=1)