You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动