Python 跨多个数据帧列Findall

Python 跨多个数据帧列Findall,python,pandas,findall,Python,Pandas,Findall,输出: data = {'Cat': ['A Phaser','A','B Phaser','B','B','B'], 'L1': ['Phase','xyzss','xyzss','Phase','xyzss','xyzss'], 'L2': ['xyzss','Stage','xyzss','xyzss','Phase2','xyzss'], 'L3': ['xyzss','xyzss','xyzss','xyzss','xyzss','St

输出:

data = {'Cat':  ['A Phaser','A','B Phaser','B','B','B'],
        'L1': ['Phase','xyzss','xyzss','Phase','xyzss','xyzss'],
        'L2': ['xyzss','Stage','xyzss','xyzss','Phase2','xyzss'],
        'L3': ['xyzss','xyzss','xyzss','xyzss','xyzss','Step'],
        }

df = pd.DataFrame (data, columns = ['Cat','L1','L2','L3'])

def funt(s):
    if re.findall(r'Phase', s, re.IGNORECASE):
        return 'Phase'
    elif re.findall(r'Stag', s, re.IGNORECASE): 
        return 'Stage'
    elif re.findall(r'Step', s, re.IGNORECASE): 
        return 'Step'
    
df[['L1','L2','L3']].apply(lambda row: '_'.join(row.values.astype(str)), axis=1).apply(lambda x : funt(x))

我想知道是否有另一种方法可以做到这一点,比如跨列应用
findall
,而不将列连接在一起?提前谢谢

筛选所需的行。使用replace将xyzss设置为null。堆叠并重置索引,您就可以将结果作为pd。系列

选项1:如果
xyzs
没有变化:
df['filter']=df.iloc[:,1:4]。替换({'xyzs':np.nan})。堆栈()。重置索引(drop=True)

选项1:如果
xyzs
发生变化:

0    Phase
1    Stage
2     None
3    Phase
4    Phase
5     Step
dtype: object

您的源代码有语法错误且不完整,请发布您遇到问题的实际代码。请尝试以下操作:
df.apply(lambda-df:df.str.extract(r'(Phase.*Stage.*),expand=False)).ffill(1).iloc[:,-1]
``谢谢。但是我不能为'xyzs'设置空值,因为它在实际数据帧中是不同的值。我们没有说过,您在原始数据帧中设置空值。这只是一个计算结果。如果需要,可以将其输出为列,甚至可以查看我的编辑。很乐意帮忙。对不起,也许我读得不对……我们不是
replace({'xyzs':np.nan})
是将所有值设为空,然后堆栈吗?在实际的数据帧中,值是不同的,所以我不能替换({'xyzs':np.nan}),所以你需要
pat=['Phase','Stage','Step','Phase2']
df.mask(~df.isin(pat),np.nan).stack().reset_index(level=1,drop=True)
df.join(pd.Series(df.mask(~df.isin(pat), np.nan).stack().reset_index(level=1, drop=True),name='filter'))