Python Pandas(dataframe)-从多个列中选择每行中的值,即在3个具有不同优先级的列表中的1个列表中

Python Pandas(dataframe)-从多个列中选择每行中的值,即在3个具有不同优先级的列表中的1个列表中,python,pandas,Python,Pandas,我正在尝试创建一个新的值列,它依赖于其他列中的值。对于选定列的每列中的每一行,比较每列的值。选择列表1中的值,否则选择列表2中的值,否则选择列表3中的值。 列表1 L1、2 L2和3 L3一起包含所有可能的值。此外,在每个列表中选择最高值 实际上,dataframe包含更多不应搜索的列,dataframe也包含更多要搜索的列。此外,这里的行比代码中给出的行多得多,列表L1、L2、L3也包含更多的值。这里的示例仅作为MWE给出 我得到了这个密码: from io import StringIO i

我正在尝试创建一个新的值列,它依赖于其他列中的值。对于选定列的每列中的每一行,比较每列的值。选择列表1中的值,否则选择列表2中的值,否则选择列表3中的值。 列表1 L1、2 L2和3 L3一起包含所有可能的值。此外,在每个列表中选择最高值

实际上,dataframe包含更多不应搜索的列,dataframe也包含更多要搜索的列。此外,这里的行比代码中给出的行多得多,列表L1、L2、L3也包含更多的值。这里的示例仅作为MWE给出

我得到了这个密码:

from io import StringIO
import pandas as pd
import numpy as np

L1 = [1, 5, 9]
L2 = [8, 3, 6]
L3 = [2, 4, 7]

txt = u'''id    col1            col2           col3    
A                1               9              8
B                5               6              9
C                9               1              4
D                3               8              7
F                6               3              1
G                8               5              7
'''

df = pd.read_table(StringIO(txt), sep="\s+")

m1 = (df['col1'].isin(L1) & df['col3'].isin(L2)) | (~df['col1'].isin(L1) & df['col1'].isin(L2) & df['col3'].isin(L3))
m2 = (df['col3'].isin(L1) & df['col1'].isin(L2)) | (~df['col3'].isin(L1) & df['col3'].isin(L2) & df['col1'].isin(L3))

m3 = (df['col2'].isin(L1) & df['col3'].isin(L2)) | (~df['col2'].isin(L1) & df['col2'].isin(L2) & df['col3'].isin(L3))
m4 = (df['col3'].isin(L1) & df['col2'].isin(L2)) | (~df['col3'].isin(L1) & df['col3'].isin(L2) & df['col2'].isin(L3))

m5 = (df['col2'].isin(L1) & df['col1'].isin(L2)) | (~df['col2'].isin(L1) & df['col2'].isin(L2) & df['col1'].isin(L3))
m6 = (df['col1'].isin(L1) & df['col2'].isin(L2)) | (~df['col1'].isin(L1) & df['col1'].isin(L2) & df['col2'].isin(L3))


df['FinalSelection'] = np.select([m1|m2, m3|m4, m5|m6], [df['col1'], df['col2'], df['col3']], default=df['col1'])
其输出如下:

id  col1    col2    col3           FinalSelection
A   1        9       8                    1
B   5        6       9                    6
C   9        1       4                    9
D   3        8       7                    3
F   6        3       1                    6
G   8        5       7                    8
在“最终选择”列中编辑更正的打字错误 但是,最后一列FinalSelection是错误的,应该是:

FinalSelection
      9
      9
      9
      8
      1
      5
因此,简而言之,我想从列表1中选择一个值,如果该值在我们搜索的列中的行上可用。否则,从列表2中删除。否则从列表3中选择。此外,在每个列表中选择最高的数字。[实际上,我们选择的是数据帧本身的值,而不是列表。]


如何做到这一点?

这应该满足您的需求:

def select(row):
    for lst in [L1, L2, L3]:
        for val in sorted(row[1:], reverse=True):
            if val in lst:
                return val

df['Final Selection'] = df.apply(select, axis=1)

我正在研究这个问题,但我的结果与您要求的结果不同,因为我对您要查找的内容感到困惑:我理解,从数据帧1、9、8的第一行开始,您需要L1中可用的最高值(如果存在)。因为L1是[1,5,9],所以结果应该是9。然而,你的输出是1。你能澄清一下你的算法应该做什么吗?你完全正确,我这边的错别字。结果应该是9。现在更正了。在我解释您的评论时,您非常清楚算法应该做什么。这不也适用于其他行吗?我的解决方案为FinalSelection列提供以下值:[9,9,9,8,1,5]。第二行和第三行也有一个9,它出现在L1中,等等。哦,我看到你现在改变了它。请参阅下面的解决方案。