Python拆分同时具有公制和英制单位的列

2024-10-01 04:50:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个混合了单位的列,我需要把它分成两个不同的列:一个是公制(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']

但我不能让它工作


Tags: orindfcm单位colfindmm
3条回答

试试熊猫^{}

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

假设此输入数据帧:

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              

使用:

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您将获得预期的输出

相关问题 更多 >