【问题标题】:How to extract text from a column in pandas如何从熊猫的列中提取文本
【发布时间】:2021-11-10 01:20:50
【问题描述】:

我在具有这种格式“1_A01_1_1_NA”的熊猫 df 中有列我想提取下划线之间的文本,例如“A01”“1”“1”和“NA”,我尝试使用左右和中间但问题是,在某些时候,列值会变成这样的 11_B40_11_8_NA。

Pd df 有 7510 行。

【问题讨论】:

  • 请添加示例数据框和预期输出
  • 为什么不用split函数???
  • 为什么提取了NA而不是第一个1

标签: python pandas string


【解决方案1】:

使用str.split:

df = pd.DataFrame({'Col1': ['1_A01_1_1_NA', '11_B40_11_8_NA']})
out = df['Col1'].str.split('_', expand=True)

输出:

>>> out
    0    1   2  3   4
0   1  A01   1  1  NA
1  11  B40  11  8  NA

【讨论】:

    【解决方案2】:

    您要查找的函数是Pandas.series.str.split()

    您应该能够将讨厌的专栏作为一个系列并使用str.split("_", expand = True) 方法。您可以看到“expand”关键字正是您从结果中创建新列所需要的(拆分“_”字符,而不是任何特定索引)。


    所以,是这样的:

    首先,我们需要像你一样创造一些废话。 (请原谅我乱七八糟的代码,我还是新手)

    import pandas as pd
    from random import choice
    import string
    
    # Creating Nonsense Data Frame
    
    def make_nonsense_codes():
        """
        Returns a string of nonsense like '11_B40_11_8_NA'
        """
        nonsense = "_".join(
            [
                "".join(choice(string.digits) for i in range(2)),
                "".join(
                    [choice(string.ascii_uppercase),
                    "".join([choice(string.digits) for i in range(2)])
                    ]
                ),
                "".join(choice(string.digits) for i in range(2)),
                choice(string.digits),
                "NA"
            ]
        )
        return nonsense
    
    my_nonsense_df = pd.DataFrame(
        {"Nonsense" : [make_nonsense_codes() for i in range(5)]}
    )
    
    print(my_nonsense_df)
    
    #         Nonsense
    # 0  25_S91_13_1_NA
    # 1  80_O54_58_4_NA
    # 2  01_N98_68_3_NA
    # 3  88_B37_14_9_NA
    # 4  62_N65_73_7_NA
    
    

    现在我们可以选择我们的"Nonsense" 列,并使用str.split()

    # Wrangling the nonsense column with series.str.split()
    wrangled_nonsense_df = my_nonsense_df["Nonsense"].str.split("_", expand = True)
    print(wrangled_nonsense_df)
    
    #     0    1   2  3   4
    # 0  25  S91  13  1  NA
    # 1  80  O54  58  4  NA
    # 2  01  N98  68  3  NA
    # 3  88  B37  14  9  NA
    # 4  62  N65  73  7  NA
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-01
      • 2021-10-22
      • 2019-05-21
      • 2018-05-24
      • 2020-12-21
      • 2016-10-20
      • 2021-11-18
      • 2018-11-16
      相关资源
      最近更新 更多