[問題] 股票代碼與名稱分開

看板Python作者 (八億)時間7年前 (2017/02/27 22:35), 編輯推噓6(6024)
留言30則, 7人參與, 最新討論串1/1
大家好,沒有程式基礎初學python,連假在家看影片自學, 遇到以下問題,懇求為小弟解答, 原始資料範例如下: 股票名稱 收盤 1 1101台泥 10 2 1102亞泥 10 3 1103嘉泥 10 4 1104環泥 10 5 1108幸福 10 欲轉換為: 代號 名稱 股票名稱 收盤 1 1101 台泥 1101台泥 10 2 1102 亞泥 1102亞泥 10 3 1103 嘉泥 1103嘉泥 10 4 1104 環泥 1104環泥 10 5 1108 幸福 1108幸福 10 想法是希望擷取股票名稱的前4碼出來作為代號,4碼後就當名稱, 花了很多時間找資料與嘗試還是無法成功,觀念很混亂,只知道應該會用到str、split、\d+.... 還請有人能幫忙解惑,謝謝 p.s.格式是用pandas,所以還要再新增欄位 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.240.241.222 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1488206112.A.DC8.html

02/27 23:08, , 1F
x = '1101台泥' , x[0:4] '1101' x[5:8] '台泥'
02/27 23:08, 1F

02/27 23:09, , 2F
打錯 是 x[4:8]
02/27 23:09, 2F

02/27 23:53, , 3F
我想的太簡單了,中文編碼字串長度比這複雜,這樣用有
02/27 23:53, 3F

02/27 23:54, , 4F
點問題,抱歉請忽略上面的回答
02/27 23:54, 4F

02/28 00:00, , 5F
# encoding: utf-8
02/28 00:00, 5F

02/28 00:00, , 6F
print(a[0:3])
02/28 00:00, 6F

02/28 00:00, , 7F
print(a[4:])
02/28 00:00, 7F

02/28 00:01, , 8F
少打一行 a="1101台泥"
02/28 00:01, 8F

02/28 00:06, , 9F
id = df[0].str[0:4]
02/28 00:06, 9F

02/28 00:06, , 10F
name = df[0].str[4:]
02/28 00:06, 10F

02/28 00:06, , 11F
df2 = pd.DataFrame()
02/28 00:06, 11F

02/28 00:07, , 12F
df2[0] = id , df2[1] = name
02/28 00:07, 12F

02/28 00:26, , 13F
一樓其實如果你用 Python 3 就是這麼簡單
02/28 00:26, 13F

02/28 00:32, , 14F
len(x) 結果是 6 ,x[4:6]也是 '台泥' 我想我觀念不
02/28 00:32, 14F

02/28 00:33, , 15F
清楚,還得研究一下。比較安全就是[4:],因為台股股
02/28 00:33, 15F

02/28 00:33, , 16F
票名稱還有兩個字以上的上
02/28 00:33, 16F

02/28 00:44, , 17F
非常謝謝各位的回覆 明天繼續努力嘗試
02/28 00:44, 17F

02/28 00:46, , 18F
更神奇的是x[4:1234567]後面隨便甚麼數字都是'台泥'
02/28 00:46, 18F

02/28 00:48, , 19F
是我哪邊搞錯了嗎 QQ
02/28 00:48, 19F

02/28 00:52, , 20F
為甚麼不會抱怨index超出範圍QQ
02/28 00:52, 20F

02/28 00:55, , 21F
Slice 不會管超過範圍
02/28 00:55, 21F

02/28 01:31, , 22F
原來如此 感謝u大解說
02/28 01:31, 22F

02/28 14:05, , 23F
substring 疑 這好像是sql寫法
02/28 14:05, 23F

03/01 00:13, , 24F
x='1101台泥',code=re.findall('[0-9]{4}',x)
03/01 00:13, 24F

03/01 00:14, , 25F
name=x.replace(code,'')
03/01 00:14, 25F

03/01 00:14, , 26F
更正 code=re.findall('[0-9]{4}',x)[0]
03/01 00:14, 26F

03/01 20:15, , 27F
我最後採用 df['代號'] = df['股票名稱'].str[0:4]
03/01 20:15, 27F

03/01 20:17, , 28F
成功分別出代號與名稱,但是放在最後兩欄
03/01 20:17, 28F

03/01 20:18, , 29F
想請問有什麼方法可以調整欄位,將它們放到前面???
03/01 20:18, 29F

03/04 00:26, , 30F
ABCD to ACDB => df[['A','C','D','B']]
03/04 00:26, 30F
文章代碼(AID): #1Oj3aWt8 (Python)