开发者社区 > 大数据与机器学习 > 大数据计算 MaxCompute > 正文

pyodps我想获得df某一列trim后长度为0,而且不是null的量级,应该怎么写呢?

pyodps我想获得df某一列trim后长度为0,而且不是null的量级,应该怎么写呢?

展开
收起
离原 2023-03-06 17:19:56 542 0
4 条回答
写回答
取消 提交回答
  • 天下风云出我辈,一入江湖岁月催,皇图霸业谈笑中,不胜人生一场醉。

    可以使用 PyODPS 的 trim 函数和 pandas 的 dropna 函数来实现这个目标。 首先,使用 PyODPS 获取数据表并将其转换为 pandas DataFrame:

    python

    from odps import ODPS import pandas as pd

    创建 ODPS 连接

    access_id = 'your_access_id' access_key = 'your_access_key' project = 'your_project_name' end_point = 'your_end_point' o = ODPS(access_id, access_key, project, end_point)

    获取数据表

    table_name = 'your_table_name' table = o.get_table(table_name)

    将数据表转换为 pandas DataFrame

    df = table.to_df()

    然后,使用 pandas 的 str.len() 方法获取每个元素的长度,并使用 dropna() 方法删除空值:

    python

    获取长度为 0 的列

    column_name = 'your_column_name' length_zero = df[column_name].str.trim().str.len() == 0 not_null = df[column_name].notnull() result = df[length_zero & not_null]

    2023-03-07 08:44:30
    赞同 展开评论 打赏
  • 可以使用PyODPS的DataFrame API来实现这个需求。具体操作步骤如下:

    1. 使用df.trim()方法来去除字符串列的前后空格。
    2. 使用df.apply()方法来应用一个自定义函数,该函数返回一个布尔值,表示该列是否符合条件。
    3. 使用df.loc[]方法来选择符合条件的行。 下面是一个示例代码:
    import odps
    from odps import options
    from odps.df import DataFrame
    
    options.sql.use_odps2_extension = True
    
    # 创建ODPS连接
    o = odps.ODPS('your_access_id', 'your_access_key', 'your_project', 'your_endpoint')
    
    # 读取表数据
    df = DataFrame(o.get_table('your_table'))
    
    # 定义自定义函数
    def is_valid(s):
        return len(s.strip()) == 0 and s is not None
    
    # 应用自定义函数并选择符合条件的行
    result = df.loc[df.apply(lambda x: is_valid(x['your_column']), axis=1)]
    
    # 输出结果
    print(result)
    

    'your_access_id'、'your_access_key'、'your_project'和'your_endpoint'需要替换为您自己的ODPS连接信息,'your_table'和'your_column'需要替换为您要操作的表和列名。

    2023-03-07 08:38:37
    赞同 展开评论 打赏
  • 坚持这件事孤独又漫长。
    • 可以使用以下代码来得到 df 某一列 trim 后长度为 0,且不为 null 的数量:
    from odps.df import Scalar
    from odps import types
    
    # 假设您要操作的 DataFrame 名称为 df,某一列名称为 col_name
    # 先使用 trim 函数将该列中的字符串前后空格去除
    trimmed_col = df[col_name].trim()
    
    # 统计符合条件的记录数
    count = df.filter((Scalar(trimmed_col) == '').ifelse(1, 0).astype(types.boolean) & df[col_name].notnull()).count().execute()
    

    这段代码的逻辑是:

    • 使用 trim 函数将目标列中的字符串的前后空格去除,生成一个新的被 trim 后的列 trimmed_col;
    • 使用 filter 函数筛选出满足条件的记录,注意要加上 & df[col_name].notnull() 条件,以排除 null 值。在这里,我们使用 Scalar 函数将一个 Python 值转化为一个 ODPS 语义的标量,即将 trimmed_col == '' 转化为一个标量(即一个包含一个元素的 DataFrame),然后使用 ifelse 函数将其转化为 0 或 1 的值,并将其转化为 boolean 类型。这样就可以排除掉符合要求的 null 值了。
    • 使用 count 函数统计得到满足条件的记录数。

    最后,可以输出 count 值,或将它存储到其他变量中进行进一步的处理。

    2023-03-06 20:16:16
    赞同 展开评论 打赏
  • 月移花影,暗香浮动

    可以使用 pandas 库的 str 属性中的 strip() 和 len() 方法来实现,例如:

    import pandas as pd
    from odps.df import DataFrame
    
    # 假设需要筛选的列名为 'col'
    odps_df = DataFrame.from_table('table_name')
    
    # 转换为 pandas 的 DataFrame
    pandas_df = odps_df.to_pandas()
    
    # 使用 pandas 的 str 属性中的 strip() 和 len() 方法进行筛选
    filtered_df = pandas_df[pandas_df['col'].str.strip().apply(len) > 0]
    
    # 转换回 odps 的 DataFrame
    result_odps_df = DataFrame(filtered_df)
    

    上述代码中,将 odps 的 DataFrame 转换为 pandas 的 DataFrame,使用 str 属性中的 strip() 和 len() 方法进行筛选,再将结果转换回 odps 的 DataFrame。其中 strip() 方法用于删除字符串两端的空格,apply(len) 方法是将每个单元格中的字符串应用 len() 函数,得到长度,>0即表示长度不为零。

    2023-03-06 17:32:36
    赞同 展开评论 打赏

MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载