列出迭代和正则表达式,删除我不需要的文本的更好方法是什么?

时间:2017-06-30 12:00:45

标签: python-3.x pandas

我们处理志愿者的数据,使用ODK将数据输入表格。下载数据时,标题(列名称)行包含许多我们不需要的“东西”。模式如下:

'组别1 / most_common / G27'

我想替换列名(最多可以有200个)或创建一个DataFrame的副本,其列名只包含G代码(Gxxx)。我想我明白了。

更快或更好的方法是什么? 在排序顺序方面,输出是否可靠?截至目前,似乎结果列表与原始列表的顺序相同。

    y = ['Group1/most common/G95', 'Group1/most common/G24', 'Group3/plastics/G132']

    import re
    r = []
    for x in y:
        m = re.findall(r'G\d+', x)
        r.append(m)

    # the comprehension below is to flatten it
    # append.m gives me a list of lists (each list has one item)

    results = [q for t in r for q in t]
    print(results)

    ['G95', 'G24', 'G132']

想法是迭代DataFrame(或副本)中的列名,删除我不需要的内容并替换(inplace = True)。

感谢您的意见。

1 个答案:

答案 0 :(得分:2)

您可以使用str.extract

df = pd.DataFrame(columns=['Group1/most common/G95', 
                           'Group1/most common/G24', 
                           'Group3/plastics/G132'])
print (df)
Empty DataFrame
Columns: [Group1/most common/G95, Group1/most common/G24, Group3/plastics/G132]
Index: []

df.columns = df.columns.str.extract('(G\d+)', expand=False)
print (df)
Empty DataFrame
Columns: [G95, G24, G132]
Index: []

使用rsplit的另一个解决方案,并使用[-1]选择最后一个值:

df.columns = df.columns.str.rsplit('/').str[-1]
print (df)
Empty DataFrame
Columns: [G95, G24, G132]
Index: []