如何对包含数字和字符串的DataFrame列进行标签编码?

时间:2019-10-21 10:03:01

标签: python-3.x string pandas dataframe encoding

我有此DataFrame列

+-------------------------------------+--+
|                df:                  |  |
+-------------------------------------+--+
| Index           Ticket*             |  |
| 0               254326              |  |
| 1               CA345               |  |
| 3               SA12                |  |
| 4               267891              |  |
| '               '                   |  |
| '               '                   |  |
| '               '                   |  |
| 700            CA356                |  |
+-------------------------------------+--+

它包含两种值。有些是纯数字,有些是带有字母和数字的字符串。

许多行具有相同的字母(CA345,CA675等)。我想用相同的字母和相同的数字对行进行分组和标记。

例如。所有将“ CA”标记为0的行,将所有“ SA”标记为1的行。

其余所有行都有六个数字(其中没有字母)。我想用相同的数字标记所有这样的行(例如说2)

2 个答案:

答案 0 :(得分:1)

第一种方法

定义自定义函数,检查行isinstance(val, str)并包含"SA""CA"

def label_ticket(row):
    if isinstance(row['Ticket'], str) and 'CA' in row['Ticket']:
        return 0
    if isinstance(row['Ticket'], str) and 'SA' in row['Ticket']:
        return 1
    return 2

将自定义函数应用于新列df('Label')

df['Label'] = df.apply(label_ticket, axis=1)
print(df)
     Ticket  Label
0    254326      2
1     CA345      0
2      SA12      1
3    267891      2
700   CA356      0

第二种方法

进一步了解情况后,您似乎不知道df['Ticket']中将出现哪些实例。在这种情况下,您可以使用re.split()搜索所有字符串模式并将它们相应地分类。

import pandas as pd
import re
df = pd.DataFrame(columns=['Ticket'],
                  data=[[254326],
                        ['CA345'],
                        ['SA12'],
                        [267891],
                        ['CA356']])
df['Pattern'] = df['Ticket'].apply(lambda x: ''.join(re.split("[^a-zA-Z]*", str(x))))
df_label = pd.DataFrame(df['Pattern'].unique(), columns=['Pattern']).reset_index(level=0).rename(columns={'index': 'Label'})
df = df.merge(df_label, how='left')
print(df)

   Ticket Pattern  Label
0  254326              0
1   CA345      CA      1
2    SA12      SA      2
3  267891              0
4   CA356      CA      1

答案 1 :(得分:0)

我对python的了解不足,但是

您可以尝试pandas.Series.str.extract

% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 tar: This does not look like a tar archive tar: Exiting with failure status due to previous errors

赞:

regular expression

输出:

ptrn=r'(?P<CA>(CA[\d]+))|(?P<SA>(SA[\d]+))|(?P<DIGIT>[\d]{6})'
import pandas as pd
import numpy as np

ls={'tk':[ '254326' ,  'CA345',  'SA12'    ,  '267891'  ,        'CA356' ]}
df = pd.DataFrame(ls)
s=df['tk'].str.extract(ptrn,expand=False)
newDf={0:[x for x in s['CA'] if pd.isnull(x)==False],1:[x for x in s['SA'] if pd.isnull(x)==False],2:[x for x in s['DIGIT'] if pd.isnull(x)==False]}
print(newDf)

demo