【问题标题】:熊猫 findall() 可以返回 str 而不是列表吗?
【发布时间】:2022-01-23 16:35:26
【问题描述】:

我有一个包含很多变量的 pandas 数据框:

df.columns
Out[0]: 
Index(['COUNADU_SOIL_P_NUMBER_16_DA_B_VE_count_nr_lesion_PRATZE',
       'COUNEGG_SOIL_P_NUMBER_50_DA_B_VT_count_nr_lesion_PRATZE',
       'COUNJUV_SOIL_P_NUMBER_128_DA_B_V6_count_nr_lesion_PRATZE',
       'COUNADU_SOIL_P_SAUDPC_150_DA_B_V6_lesion_saudpc_PRATZE',
       'CONTRO_SOIL_P_pUNCK_150_DA_B_V6_lesion_p_control_PRATZE',
       'COUNJUV_SOIL_P_p_0_100_16_DA_B_V6_lesion_incidence_PRATZE',
       'COUNADU_SOIL_P_p_0_100_50_DA_B_VT_lesion_incidence_PRATZE',
       'COUNEGG_SOIL_P_p_0_100_128_DA_B_VT_lesion_incidence_PRATZE',
       'COUNEGG_SOIL_P_NUMBER_50_DA_B_V6_count_nr_spiral_HELYSP',
       'COUNJUV_SOIL_P_NUMBER_128_DA_B_V10_count_nr_spiral_HELYSP', # and so on

我想只保留 DA 后面的数字,所以第一列是16_DA。我一直在使用pandas函数findall()

df.columns.str.findall(r'[0-9]*\_DA')
Out[595]: 
Index([ ['16_DA'],  ['50_DA'], ['128_DA'], ['150_DA'], ['150_DA'],
        ['16_DA'],  ['50_DA'], ['128_DA'],  ['50_DA'], ['128_DA'], ['150_DA'],
        ['150_DA'],  ['50_DA'], ['128_DA'],

但这会返回一个列表,我想避免这种情况,所以我最终会得到一个如下所示的列索引:

df.columns
Out[595]: 
Index('16_DA',  '50_DA', '128_DA', '150_DA', '150_DA',
      '16_DA',  '50_DA', '128_DA',  '50_DA', '128_DA', '150_DA',

有没有更流畅的方法来做到这一点?

【问题讨论】:

  • 你希望你的输出是什么样的?你只想要第一个值吗?还是需要将列表转换成字符串?

标签: python regex pandas


【解决方案1】:

您可以使用.str.join(", ") 以逗号和空格加入所有找到的匹配项:

df.columns.str.findall(r'\d+_DA').str.join(", ")

或者,只需使用str.extract 来获得第一个匹配项:

df.columns.str.extract(r'(\d+_DA)', expand=False)

【讨论】:

  • df.columns.str.extract(r'(\d+_DA)', expand=False) 和 df.columns.str.findall(r'\d+_DA').str。 join(", ") 完美运行
【解决方案2】:
from typing import List


pattern = r'[0-9]*\_DA'
flattened: List[str] = sum(df.columns.str.findall(pattern), [])
output: str = ",".join(flattened)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 2023-01-18
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    相关资源
    最近更新 更多