【问题标题】:Python Split a column that has both metric and imperial unitsPython拆分具有公制和英制单位的列
【发布时间】:2021-09-29 20:09:25
【问题描述】:

我有一列包含多种单位,我需要将其分成两个不同的列:一列用于公制(mm、cm、m),另一列用于英制(in、ft、yd)

d = {'col1': [1 in, 2 mm, 3 ft, 4 yd, 5 m, 6cm]}
df = pd.DataFrame(data=d)

拆分成:

Index    df_metric  df_imperial
 0    |            |      1 in
---------------------------------
 1    |     2 mm   |
---------------------------------
 2    |            |     3 ft
---------------------------------
 3    |            |     4 yd
---------------------------------
 4    |     5 m    |
---------------------------------
 5    |     6 cm   |

我试过了:

def seperate_units(df, col, numbers):
    if numbers.find('yd') > -1 or numbers.find('in') > -1 or numbers.find('ft') > -1 or numbers.find('"') > -1:
        print(numbers)
        df[col+'_imperial'].append(numbers)
    else:
        df[col+'_imperial'].append('')
    return df[col+'_imperial']

但我无法让它工作

【问题讨论】:

    标签: python pandas multiple-columns units-of-measurement


    【解决方案1】:

    试试熊猫pandas.Series.str.contains

    d = {'col1': ['1 in', '2 mm', '3 ft', '4 yd', '5 m', '6cm']}
    df = pd.DataFrame(data=d)
    
    df['metric'] = df[df['col1'].str.contains(r'mm|cm|m')]['col1']
    df['imperial'] = df[df['col1'].str.contains(r'in|ft|yd')]['col1']
    
    print(df)
    
    
    #    col1 metric imperial
    # 0  1 in    NaN     1 in
    # 1  2 mm   2 mm      NaN
    # 2  3 ft    NaN     3 ft
    # 3  4 yd    NaN     4 yd
    # 4   5 m    5 m      NaN
    # 5   6cm    6cm      NaN
    

    【讨论】:

      【解决方案2】:

      使用:

      m=df['col1'].str.contains(r'mm|cm|m')
      #checking for metric
      y=df['col1'].str.contains(r'in|ft|yd')
      #checking for imperial
      

      最后:

      df.loc[:,'df_metric']=df.loc[m,'col1']
      df.loc[:,'df_imperial']=df.loc[y,'col1']
      #If needed:
      #df[['df_metric','df_imperial']]=df[['df_metric','df_imperial']].fillna('')
      

      现在您打印df,您将获得预期的输出

      【讨论】:

        【解决方案3】:

        假设这个输入数据帧:

        df = pd.DataFrame({'col1': ['1 in', '2 mm', '3 ft', '4 yd', '5 m', '6cm']})
        

        您可以使用正则表达式来查找公制单位并在此条件下拆分:

        metric = df.col1.str.match('\d+\s*[cm]?m')
        
        pd.concat([df.where(metric, '').add_suffix('_metric'),
                   df.where(~metric, '').add_suffix('_imperial')],
                  axis=1)
        

        这里的正则表达式匹配一个后跟 cm/m/mm 的数字,您可以根据您的实际用例对其进行更新。 在where 中,我将其替换为空字符串'',但您可以将其删除以具有NaN,或者如果您愿意,可以将其替换为其他任何内容。

        输出:

          col1_metric col1_imperial
        0                      1 in
        1        2 mm              
        2                      3 ft
        3                      4 yd
        4         5 m              
        5         6cm              
        

        【讨论】:

          猜你喜欢
          • 2017-02-10
          • 1970-01-01
          • 2020-01-30
          • 1970-01-01
          • 1970-01-01
          • 2010-09-24
          • 2019-03-20
          • 2011-10-24
          • 1970-01-01
          相关资源
          最近更新 更多