一直試圖用熊貓操縱一些資料,但沒有任何運氣。
我有一列資料,很亂。它包含代碼。每個單元格最多只有兩個代碼(我認為)。
其中一些代碼用 a 分割,/但第二部分只包含最后一個破折號 ( -)之后的最后一部分代碼(例如 k500-899-200 / 300 代表兩個代碼:k500-899-200 和 k500-899-300 )
有些只有一個代碼。有些代碼用 a 分隔&,其他代碼用 a 分隔#。有些單元格只是空白。
我想要一個新列,其中代碼完全寫出,;如果有兩個代碼而不是一個代碼,則用 分隔。
我擁有的:
colA
JA01-03-AP-00075 / 00014
JA01-03-AP-00065 / 00013
JA01-03-AP-00089
JA01-05-AP-00089 & JA01-03-AP-08894
JA09-08-BC-88873#JA09-08-BC-88845
JA09-08-BC-88123#
dummy
[blank]
unset
我想要的是
ColA ColB
JA01-03-AP-00075 / 00014 JA01-03-AP-00075 ; JA01-03-AP-00014
JA01-03-AP-00065 / 00013 JA01-03-AP-00065 ; JA01-03-AP-00013
JA01-03-AP-00089 JA01-03-AP-00089
JA01-05-AP-00089 & JA01-03-AP-08894 JA01-05-AP-00089 ; JA01-03-AP-08894
JA09-08-BC-88873 # JA09-08-BC-88845 JA09-08-BC-88873 ; JA09-08-BC-88845
JA09-08-BC-88123# JA09-08-BC-88123
dummy dummy
[blank] [blank]
unset unset
到目前為止,我一直專注于嘗試通過/. 我的代碼有點像這樣,雖然它實際上不起作用,因為我傾向于得到一個“運算元不能一起廣播”的錯誤。我還沒弄清楚為什么。
但我覺得我有點把它復雜化了。
def split_code(code):
split_code = code.split('/')
return split_code if len(split_code) == 2 else ['', split_code[0]]
df[['tempCol1', 'tempCol2']] = pd.DataFrame(df['ColA'].apply(split_code).tolist())
df['ColB'] = np.where(df['ColA'].str.contains('/'),
df['tempCol1'].str.rsplit('-', 1)[0] df['tempCol2'],
df['ColA'])
uj5u.com熱心網友回復:
這有效,至少根據您的預期輸出:
regex = re.compile(r'\s*[/&#]\s*')
def p(col):
parts = regex.split(col.strip('&#;/'))
if len(parts) > 1:
if parts[1].count('-') <= 1: # short code
parts[1] = f'{"-".join(parts[0].split("-")[0:-1])}-{parts[1]}'
return ' ; '.join(parts)
df['ColB'] = df['ColA'].transform(p)
uj5u.com熱心網友回復:
# match prefix-suffix1 / suffix2
pat = r'(?P<prefix>. )-(?P<suffix1>\d )\s*\/\s*(?P<suffix2>\d )'
# m is a re.Match object
# prefix-suffix1 / suffix2 => prefix-suffix1 ; prefix-suffix2
def repl_suffix(m):
return f"{m['prefix']}-{m['suffix1']} ; {m['prefix']}-{m['suffix2']}"
df['colB'] = (
df['colA'].str.replace(pat, repl_suffix)
.str.rstrip(r';#&') # strip ';','#','&' from single codes
.str.replace(r'\s*(#|&)\s*',' ; ') # '#' and '&' => ';'
)
>>> df
colA colB
0 JA01-03-AP-00075 / 00014 JA01-03-AP-00075 ; JA01-03-AP-00014
1 JA01-03-AP-00065 / 00013 JA01-03-AP-00065 ; JA01-03-AP-00013
2 JA01-03-AP-00089 JA01-03-AP-00089
3 JA01-05-AP-00089 & JA01-03-AP-08894 JA01-05-AP-00089 ; JA01-03-AP-08894
4 JA09-08-BC-88873#JA09-08-BC-88845 JA09-08-BC-88873 ; JA09-08-BC-88845
5 JA09-08-BC-88123# JA09-08-BC-88123
編輯:我假設后綴總是數字,但您可以輕松地概括任何后綴。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/350545.html
上一篇:將2個python串列轉換為1個Numpy陣列,格式為((list1,list2))
下一篇:Excel日期公式 3個月
