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

提问人:PineNuts0 提问时间:11/17/2023 最后编辑:PineNuts0 更新时间:11/17/2023 访问量:43

问:

假设我从下面的输入表开始:

日期 编号 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”,但我想学习一种更有效的方法来做到这一点。

Python 数据帧 列表 筛选器 isin

评论

0赞 PineNuts0 11/17/2023
当然,我会添加代码来制作表格
0赞 Mark 11/17/2023
类似作品的东西df.apply(lambda row: row[row.isin(code_list)].values[-1] if row.isin(code_list).any() else None, axis=1)
1赞 PineNuts0 11/17/2023
添加了 DataFrame 表的代码

答:

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