![](/img/trans.png)
[英]Find rows where one of 2 cols contains any value from a third split column in Pandas
[英]Pandas find rows with value in any column
我正在从许多 csv 文件中读取数据作为 pandas 数据帧。 但是 csv 文件的格式并不一致。 一个例子:
Unnamed:1 Unnamed:2 .... Unnamed:20
Data NaN .... NaN
Nan Temp .... NaN
id name .... year
.
.
现在我想找到包含id
或ID
或Id
的第一行,将该行作为列名并删除其上方的任何行。 所以最后我会得到:
id name .... year
.
.
现在id
列可能并不总是第一列,即Unnamed:1
列,所以我正在检查整个行,如下所示:
df.isin(["id"]).any(axis=1)
上面代码的问题是我不确定如何检查id
的所有不同写入方式,即ID/Id/id
。 理想情况下,我想在这里使用正则表达式,但我知道它可以在没有正则表达式的情况下为特定列完成,如下所示:
df['Unnamed:1'].str.lower().str.contains('id')
我只是不知道如何同时做这两个,即检查所有列中可能写入id
的所有方式。
您可以通过过滤 output 行之前在所有列中使用匹配第一个ID/id/Id
substring,然后将第一行转换为列:
mask = (df.select_dtypes(object)
.apply(lambda x: x.str.contains('id', case=False))
.any(axis=1)
.cumsum()
.gt(0))
df = df[mask].copy()
df.columns = df.iloc[0].rename(None)
df = df.iloc[1:].reset_index(drop=True)
测试不是子字符串的另一个想法:
mask = df.isin(['id','ID','Id']).any(axis=1).cumsum().gt(0)
df = df[mask].copy()
df.columns = df.iloc[0].rename()
df = df.iloc[1:].reset_index(drop=True)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.