【问题标题】:Remove prefix from all cell values of dataframe从数据框的所有单元格值中删除前缀
【发布时间】:2020-06-07 20:01:22
【问题描述】:

我有一个 pandas 数据框,如下所示:

 col1                       col2                       col3                ...
 field1:index1:value1     field2:index2:value2       field3:index3:value3  ...
 field1:index4:value4     field2:index5:value5       field3:index5:value6  ...

字段为int类型,index为int类型,value可以为int或float类型。

我想将此数据框转换为以下预期输出:

 col1              col2                       col3    ...
 index1:value1     index2:value2       index3:value3  ...
 index4:value4     index5:value5       index5:value6  ...

我想从所有单元格中删除所有 field: 值。如何做到这一点?

编辑:一个单元格的示例如下所示:1:1:1.0445731675303e-06,我想在所有单元格中将此类字符串减少为 1:1.0445731675303e-06

【问题讨论】:

  • 是字段文本吗?是的,将^field\d*: 替换为注意
  • 它是int 类型。可能像 1: 并且每列都不同。
  • 正则表达式仅使用文本。如果转换则将^\d+: 替换为noth
  • 看我的尝试,基本上在第一个冒号后按短语分割并使用 .str[] 提取
  • 我应该发表我的承诺作为答案吗?

标签: python python-3.x regex pandas


【解决方案1】:

给定

>>> df
                   col1                  col2                  col3
0       1:index1:value1       2:index2:value2       3:index3:value3
1       1:index4:value4       2:index5:value5       3:index5:value6

你可以使用

>>> df.apply(lambda s: s.str.replace('^\d+:', '', regex=True))
            col1           col2           col3
0  index1:value1  index2:value2  index3:value3
1  index4:value4  index5:value5  index5:value6

正则表达式'^\d+:' 匹配以数字序列后跟冒号开头的字符串的开头。

【讨论】:

  • 啊好的,我的字段本身就是数字。
  • @SumitSidana 嗯?
  • 所以,基本上,每个单元格看起来像1:1:1.0445731675303e-06,其中1 是本例中的一个字段。我的问题可能并不完全清楚。但是,如果我删除 field 并从您的解决方案中保留 \d+,您的解决方案仍然有效。感谢apply 的解决方案,swifter 的解决方案,真的很快。
【解决方案2】:

试试这个:

df = df.applymap(lambda x: ':'.join(str(x).split(':')[1:]))
print(df)

            col1           col2           col3
0  index1:value1  index2:value2  index3:value3
1  index4:value4  index5:value5  index5:value6

【讨论】:

  • 它有效,但不幸的是,我只能接受 1 个答案(赞成)。
【解决方案3】:

可能的其他方法是在第一个冒号后基本上按短语拆分并使用.str[index]提取

df.apply(lambda s: s.str.split('(^[a-z0-9]+\:(.*))').str[-2])

【讨论】:

    【解决方案4】:

    另一种可能的解决方案是在列表推导中运行字符串处理,并使用旧数据框的列名创建一个新数据框:

    result = [[":".join(word.split(":")[1:])
              for word in ent]
              for ent in df.to_numpy()]
    
    pd.DataFrame(result, columns = df.columns)
    
            col1             col2           col3
    0   index1:value1   index2:value2   index3:value3
    1   index4:value4   index5:value5   index5:value6
    

    这比运行applymapapply 快...在 python 中字符串处理通常比 Pandas 快得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      相关资源
      最近更新 更多