Polars相关技术问题:打印数据位置及检测Excel表格负值时输出对应行的实现方法
Polars相关技术问题:打印数据位置及检测Excel表格负值时输出对应行的实现方法
我明白你现在的需求啦——你已经能定位到包含负值的列,但还想把这些列里对应有负值的行也完整打印出来,对吧?其实你的代码已经有不错的基础了,只需要调整处理过滤后数据的部分,甚至还能加上行号让你更清楚具体位置,我来给你捋捋怎么改。
首先,你的现有代码里,filtered_df其实就是当前列中所有包含负值的行数据,只是你没把它打印出来而已。另外,为了更精准定位Excel里的行,我们可以给Polars DataFrame加上行号索引,这样能直接对应到Excel里的行位置(注意行号从0开始,如果你需要和Excel的1起始行对应,可以在with_row_index里加offset=1)。
下面是修改后的完整代码,我加了注释说明调整的地方:
import pandas as pd import polars as pl book = r"filename.xlsx" pd_df = pd.read_excel(book, sheet_name='sheet_name') # 添加行号列,offset=1让行号从1开始,和Excel默认行号一致 df = pl.from_pandas(pd_df).with_row_index(name="行号", offset=1) negative_values = False for col in df.columns: # 跳过我们手动添加的行号列,避免无意义的检查 if col == "行号": continue # 简化类型判断的写法,用in来匹配多个类型 if df[col].dtype in (pl.Float64, pl.Int64): filtered_df = df.filter(pl.col(col) < 0) if filtered_df.height > 0: negative_values = True print(f"✅ 发现负值的列:{col}") print("👇 对应的行数据(包含行号方便定位):") print(filtered_df) # 如果你只想看行号和当前有负值的列,也可以用下面这句替代上面的print(filtered_df) # print(filtered_df.select(["行号", col])) print("-" * 60) # 分隔线让输出更清晰 if not negative_values: print("No negative values found in the DataFrame.")
如果你觉得循环列的方式不够高效,尤其是数据量很大的时候,还可以用Polars的向量化操作一次性找出所有有负值的行,不用逐列循环,效率会更高:
import pandas as pd import polars as pl book = r"filename.xlsx" pd_df = pd.read_excel(book, sheet_name='sheet_name') df = pl.from_pandas(pd_df).with_row_index(name="行号", offset=1) # 自动筛选出所有数值类型的列,不用手动指定 numeric_cols = df.select(pl.col(pl.NUMERIC_DTYPES)).columns # 生成一个布尔掩码,标记每个数值列的负值位置 negative_mask = df.select(pl.col(numeric_cols) < 0) # 结合原数据和掩码,筛选出任意数值列有负值的行 all_negative_rows = df.with_columns(negative_mask).filter( pl.any(pl.col(numeric_cols)) ) if not all_negative_rows.is_empty(): print("📊 所有包含负值的行数据:") print(all_negative_rows) else: print("No negative values found in the DataFrame.")
这样不管有多少列有负值,都能一次性把所有相关行找出来,Polars的向量化操作在处理大数据集时比循环列快很多哦。
备注:内容来源于stack exchange,提问作者Leafy




