繁体   English   中英

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
.
.

现在我想找到包含idIDId的第一行,将该行作为列名并删除其上方的任何行。 所以最后我会得到:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM