【问题标题】:Update pandas dataframe column with substring from another dataframe使用来自另一个数据帧的子字符串更新 pandas 数据帧列
【发布时间】:2022-10-14 19:56:44
【问题描述】:

我有一个数据框,其中一些信息位于错误的字段中,我需要将其更改为 wright 列。问题是这些信息是用户插入的,因此它们位于字符串的中间并且以不同的方式。下面的df是这个问题的一个小例子:

|         String          |      Info A      |      Info B      |
|-------------------------|------------------|------------------|
|        'some text'      |         50       |         60       |
|   'A=70, B=80, text'    |                  |                  |
|  'text, A = 10m, B:20'  |                  |                  |

df 的实际版本有 10 个我需要更改的变量和大约 2mi 行。

我需要做的是将这些信息放在正确的字段中,如示例的第一行所示。

我尝试了一些东西,但它们都有错误或需要很长时间。如果有人可以帮助我想出一个解决方案,我将不胜感激。

【问题讨论】:

    标签: python pandas dataframe validation split


    【解决方案1】:

    这是一个可以帮助您的简单代码。对于您的示例,您可以执行以下操作:

    import pandas as pd
    
    df = pd.DataFrame(columns=["String","Info A","Info B"])
    df["String"]=['some text','A=70, B=80, text', 'text, A = 10m, B:20']
    df["Info A"]=[50,None,None]
    df["Info B"]=[60,None,None]
    
    list_strings = list(df["String"])
    
    new_df = pd.DataFrame(columns=["String","Info A","Info B"])
    
    for str_ in list_strings:
        Nones = [None]*len(list(df.columns))
        dict_dummy = dict(zip(list(df.columns),Nones)) 
    
        split_str = str_.split(sep=",")
        
        for splited_elm in split_str :
            if "A" in splited_elm and ("=" in splited_elm or ":" in splited_elm):
                dict_dummy["Info A"] = splited_elm
                
            elif "B" in splited_elm and ("=" in splited_elm or ":" in splited_elm):
                dict_dummy["Info B"] = splited_elm
            
            else:
                dict_dummy["String"] = splited_elm
        
        new_df=new_df.append(dict_dummy,ignore_index=True)
    

    输出 :

    new_df
    Out[47]: 
          String    Info A Info B
    0  some text      None   None
    1       text      A=70   B=80
    2       text   A = 10m   B:20
    

    这个小脚本可帮助您对元素进行分类。您可以进行其他处理以使您的 df 更好。

    【讨论】:

      【解决方案2】:

      您可以使用带有str.extractall 的正则表达式来获取变量名称和值,然后使用pivot 和update:

      variables = ['A', 'B']
      regex = fr'({"|".join(variables)})s*[=:]s*(d+)'
      # '\b(A|B)\s*[=:]\s*(\d+)'
      
      df.update(df['String']
       .str.extractall(regex)
       .reset_index(level=0)
       .pivot(index='level_0', columns=0, values=1)
       .add_prefix('Info ')
      )
      

      输出:

                      String Info A Info B
      0            some text   50.0   60.0
      1     A=70, B=80, text     70     80
      2  text, A = 10m, B:20     10     20
      

      【讨论】:

        猜你喜欢
        • 2020-09-20
        • 2021-06-19
        • 2016-07-05
        • 2019-07-10
        • 2015-12-31
        • 1970-01-01
        • 1970-01-01
        • 2018-12-25
        • 2017-09-12
        相关资源
        最近更新 更多