【问题标题】:How to slice a part of a string in DF when you don't know exact position?当您不知道确切位置时,如何在 DF 中对字符串的一部分进行切片?
【发布时间】:2019-07-20 11:37:35
【问题描述】:

我正在为切片而苦苦挣扎。我认为这通常很容易并且我理解它,但是当涉及到以下情况时,我的想法不起作用。

情况: 在我的 DF 列之一中,我想在所有行中删除一些有时会出现有时不会出现的字符串。

问题如下:

1.我不知道这个字符串开始的确切位置(在每一行中它可能是不同的

2.这个字符串不同,取决于每一行,但是,它总是从同一个结构开始 - 比如说:“¯main_”

3.在“¯main_”之后通常有一些数字(不同)但长度始终相同(9个数字)

4.我已经在拆分之后,我有大约 40 列(每列都有类似的问题)。这就是为什么我正在寻找一些更有效的方法来解决它,然后拆分,生成大约 40 列然后删除它们。

5.有时在这个带有“¯main_”的字符串之后,我想在同一列中保留一些额外的字符串。

例子:

Column1
A1-19
B2-52
C3-1245¯main_123456789
D4
Z89028
F7¯main_123456789,Z241

寻找这样的结果:

Column1
A1-19
B2-52
C3-1245
D4
Z89028
F7,Z241

到目前为止我准备的最好的解决方案:

a = test.find("¯")
b = a+14
df[0].str.slice(start = a, stop = b)

但是:

1.它不能正常工作

2.而且我知道 test.find() 在找不到字符时会返回 -1。我不知道如何摆脱它 - 写一个循环?我相信存在一些更好(更有效)的解决方案。然而,经过几个小时的寻找,我决定寻求帮助。

【问题讨论】:

    标签: python pandas data-science data-scrubbing


    【解决方案1】:

    按所有列循环,按位置拆分并将提取的字符串按位置附加到帮助列表,最后分配回列:

    print (df)
                       Column1
    0                      NaN
    1                    B2-52
    2  C3-1245¯main_123456789
    3                       D4
    4                   Z89028
    5  F7¯main_123456789,Z241
    
    for c in df.columns:
        out = []
        for x in df[c]:
            if x == x:
                p = x.find('¯')
                if p != -1:
                    out.append(x[:p] + x[p+14:])
                else:
                    out.append(x)
            else:
                out.append(x)
        df[c] = out
    
    print (df)
         Column1
    0        NaN
    1      B2-52
    2  C3-1245Â9
    3         D4
    4     Z89028
    5  F7Â9,Z241
    

    【讨论】:

    • 谢谢jezrael,你说得对,它可以工作。但是,我应该提到我已经在拆分之后,并且我有大约 40 列具有所描述的情况。这就是为什么我正在寻找一些更有效的实现方法的原因,这可能会让我免于生成 +40 列然后删除它们。我会把它添加到我的问题中。抱歉不清楚。
    • @KubaS - 没问题。您需要对所有列应用解决方案吗?
    • 是的,有时在这个带有“¯main_”的字符串之后,我想在同一列中保留一些额外的字符串。
    • @KubaS - 你能检查我的解决方案吗?它遍历所有列并应用解决方案。
    • 它有效。我只需要将所有 None 值更改为 nan。对于将面临同样困难的其他人:df.fillna(value=pd.np.nan, inplace=True)。总而言之,万分感谢!你为我节省了很多时间,而且我今天学到了一些新东西!
    猜你喜欢
    • 1970-01-01
    • 2012-11-20
    • 2011-12-03
    • 2012-12-25
    • 2012-07-13
    • 1970-01-01
    • 2018-01-18
    • 2017-04-21
    • 2021-03-12
    相关资源
    最近更新 更多