繁体   English   中英

在一列上进行复杂转换,同时在 Python/Pandas 中保留原始列

[英]Complex transformation on one column, while keeping original columns in Python/Pandas

我有一个 dataframe,df,我希望在我的列中对值进行特定分隔以显示第一个单词和数字及其“T”值。 我想要用“-”分隔的第一个“单词”及其#T 值。

数据

type                                        total   free   use

AY12-AYY-AY-R800-900G-12T_18T-R6-v.A        10      5      5
AY12-AYY-AY-R800-900G-12T_18T-R6-v.A        10      4      6
AY12-AYY-AY-R800-900G-12T_18T-R6-v.A        10      1      9
AY12-AYY-AY-R800XD-900G-6.4T-R11-WOW-v.A    10      8      2
AY12-AYY-AY-R800XD-900G-6.4T-R11-WOW-v.A    10      3      7

期望的

type            total   free   use

AY12 12T        10      5      5
AY12 12T        10      4      6
AY12 12T        10      1      9
AY12 6.4T       10      8      2
AY12 6.4T       10      3      7

正在做

import pandas as pd

def extract_value(s):
    regex = re.search(r'(^.+?)-.+?(\d+(?:\.\d+)?T)', s)
    if regex:
        first_word = regex.group(1)
        code = regex.group(2)
        return f'{first_word} {code}'
    return s

df.columns = ['type', 'total', 'free', 'use']

但是,转换没有发生,结果如下:

type                                        total   free   use

AY12-AYY-AY-R800-900G-12T_18T-R6-v.A        10      5      5
AY12-AYY-AY-R800-900G-12T_18T-R6-v.A        10      4      6
AY12-AYY-AY-R800-900G-12T_18T-R6-v.A        10      1      9
AY12-AYY-AY-R800XD-900G-6.4T-R11-WOW-v.A    10      8      2
AY12-AYY-AY-R800XD-900G-6.4T-R11-WOW-v.A    10      3      7

我还在研究。 任何帮助或建议表示赞赏

虽然我确信有一个更优雅的解决方案,但这应该可以

df['type'] = df['type'].apply(lambda x: ' '.join(re.findall(r'(^.+?)-.+?(\d+(?:\.\d+)?T)', x)[0]))

你有没有尝试过:

df['type']=df['type'].str.extract('(\w+(?=[-AYY]))')+ " "+ df['type'].str.extract('(?<=0G-)(.*?)(?=\-|_)')



     type  total  free  use
0   AY12 12T     10     5    5
1   AY12 12T     10     4    6
2   AY12 12T     10     1    9
3  AY12 6.4T     10     8    2
4  AY12 6.4T     10     3    7

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM