【问题标题】:Pandas series string manipulation using Python - 1st two chars flip and append to end of string使用 Python 进行 Pandas 系列字符串操作 - 第一个两个字符翻转并附加到字符串末尾
【发布时间】:2020-07-08 21:53:21
【问题描述】:

我有一列(系列)值,我正在尝试移动字符,但我无处可去!我发现了一些 sn-ps 代码可以让我到达我所在的位置,但需要“更接近”。我正在使用一列数据类型(STR)。每列字符串都是一系列数字。有些是重复的。这些重复的数字在数字前面有一个 (n-)。 (n) 数字将根据列出的重复数字字符串的数量而变化。有些可能有两个重复,有些可能有八个重复。没关系,顺序应该保持不变。

我需要遍历每个单元格或字符串,从字符串左侧拔出 (n-),交换两个字符,并将其附加到字符串的末尾。无需数字排序。该列有 4 到 5k 行长,看起来就像下面给出的示例。没有其他特殊字符或字母。此外,无论列中的哪个位置,重复的行都将始终在一起。

我的问题是下面的代码实际上是有效的,它将逐步遍历每个字符串,评估它是否为破折号,然后以我需要的方式处理数字。但是,我还没有学会如何将更改从 python for 循环返回到我的数据框中。我真的希望有人有一个漂亮的 lambda 修复或 pandas 应用函数来一次解决整个专栏。但我还没有找到任何可以调整的东西。我知道有一个比慢慢遍历系列更好的方法,我想学习。

需要两个可能的修复:

  1. 有没有办法让下面的代码用新创建的 df.string 值替换旧的 df.string 值?如果有,请告诉我。
  2. 我一直在尝试使用拆分功能阅读 df.apply,以便一次解决整个专栏。我知道这是更聪明的游戏。有几行代码可以满足我的需要吗?

请告诉我你的想法。我很感激帮助。感谢您抽出宝贵时间。

import re
import pandas as pd
from pandas import DataFrame, Series
import numpy as np

df = pd.read_excel("E:\Book2.xlsx")

df.column1=df.column1.astype(str)

for r in df['column1']:            #Finds Column
if bool(re.search('-', r))!=True:  #test if string has '-' 
    continue
else:
    a = []                         #string holder for '-'
    b = []                         #string holder for numbers
    for c in r:
        if c == '-':               #if '-' then hold in A
            a.append(c)
        else:
            b.append(c)            #if number then hold in B
    t = (''.join(b + a))           #puts '-' at the end of string
    z = t[1:] + t[:1]              #picks up 1st position char and moves to end of string
    r = z                          #assigns new created string to df.column1 value

print(df)

Starting File:         Ending File:

column1                column1
41887                  41887
1-41845                41845-1
2-41845                41845-2
40905                  40905
1-41323                41323-1
2-41323                41323-2
3-41323                41323-3
41778                  41778

【问题讨论】:

    标签: python pandas lambda apply


    【解决方案1】:

    你可以使用 df.str.replace():

    如果我们使用包含所有值的文件重新创建您的示例并保留 column1 作为列名:

    import pandas as pd
    df=pd.read_csv('file.txt')
    df.columns=['column1']
    df['column1']=df['column1'].str.replace('(^\d)-(\d+)',r'\2-\1')
    print(df)
    

    这将提供所需的输出。用新列替换旧列,并在一个列中完成所有操作(无循环)。

    #in 
    41887                 
    1-41845               
    2-41845                
    40905               
    1-41323               
    2-41323                
    3-41323               
    41778  
    #out 
        column1
    0   41887
    1   41845-1
    2   41845-2
    3   40905
    4   41323-1
    5   41323-2
    6   41323-3
    7   41778
    

    【讨论】:

    • 感谢 Samman 帮助我解决这个问题。现在我只需要弄清楚你的代码片段,这样我就可以从中学习。再次感谢!
    • 第一行打开包含数字的文本文件,第二行只插入一个名为 column1 的列。第 3 行搜索 column1 中的所有值以查找特定的字符串格式。参数是str.replace(string to replace, string to replace it with) \d 表示任意数字,+ 表示多于一个(即 \d 为 1,\d+ 为 10)。 ^ 表示该行以该行开头。 \2 和 \1 是字符串搜索的位置(即 \1 是从 (^\d) 获得的值,而 \2 是从 (\d+) 获得的值。所以简而言之,我们正在寻找以 a 开头的任何字符串单个数字,带有连字符 (-),并且
    • 后跟多个数字(例如 1-41845),将其替换为 (^\d) 中的值,即 1 和 (\d+) 中的值,即 41845。订购时他们 \2-\1 它变成 41845-1。这是了解一些术语的开始w3schools.com/python/python_regex.asp
    • 太棒了!!这么多小部件,它可以很好地协同工作。我很欣赏解释和链接。谢谢。
    猜你喜欢
    • 2021-12-16
    • 2017-04-12
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2015-05-31
    • 2017-05-14
    相关资源
    最近更新 更多