python - 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','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))
输出:
0 Phase
1 Stage
2 None
3 Phase
4 Phase
5 Step
dtype: object
我想知道是否有另一种方法来解决这个问题,比如findall
跨列应用而不将列连接在一起?提前致谢!
解决方案
过滤所需的行。使用替换,使 xyzss 为空。堆叠并重置索引,您将获得 pd 的结果。系列。
选项 1:如果xyzss
不变: df['filter']=df.iloc[:,1:4].replace({'xyzss':np.nan}).stack().reset_index(drop=True)
选项 1:如果xyzss
变化:
df.join(pd.Series(df.mask(~df.isin(pat), np.nan).stack().reset_index(level=1, drop=True),name='filter'))
推荐阅读
- swift - 如何使用 FOSUserBundle 在我的邮件中包含激活链接?
- google-colaboratory - AttributeError:模块“tensorflow”没有属性“gfile”
- visual-studio-code - 即使在设置中更新 fontSize 后,VS Code 字体大小仍保持不变
- swift - 从 VC1 中的 firebase 检索用户数据并将其发送到 VC2 中的 TableView 以进行显示时出现问题
- c# - 如何使用 Google 日历修复通知
- swift - 有没有办法在 Apple Watch 屏幕关闭时记录动作?
- c# - 如何在 sql 查询中添加检查 ckeckboxe 是否被选中的条件?
- docker-swarm - 如何使用 Traefik 路由 docker(swarm)容器需要一个端口到 /myapp 之类的主机 url 的上下文?
- database - db2 insert trigger new 无效
- minikube - 无法访问 Minikube 上的 NodePort 服务