我有此DataFrame列
+-------------------------------------+--+
| df: | |
+-------------------------------------+--+
| Index Ticket* | |
| 0 254326 | |
| 1 CA345 | |
| 3 SA12 | |
| 4 267891 | |
| ' ' | |
| ' ' | |
| ' ' | |
| 700 CA356 | |
+-------------------------------------+--+
它包含两种值。有些是纯数字,有些是带有字母和数字的字符串。
许多行具有相同的字母(CA345,CA675等)。我想用相同的字母和相同的数字对行进行分组和标记。
例如。所有将“ CA”标记为0的行,将所有“ SA”标记为1的行。
其余所有行都有六个数字(其中没有字母)。我想用相同的数字标记所有这样的行(例如说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)