Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

pythonでISBNを区切る

Q&A

Closed

解決したいこと

Pythonの初歩的な質問です。
書誌データを扱うデータフレームで、書名のほかに'ISBN'という列が入っています。
例えば「退屈なことはPythonにやらせよう」のISBNは
9784873117782
ですが、こういったISBNの数字の前から6桁、後ろから1桁をとりのぞき
311778
といった数字だけを抽出した列を作るには、'ISBN'という列に対してどのようなコードを書けばいいでしょうか。

またISBNの列の型はintからstrに変更する必要はあるでしょうか。

自分で試したこと

split関数など使ってみましたがどうもうまくいきません。
Excelでいうとデータの区切り位置で固定長で切るような作業です。
よろしくお願いします。

<追記>
実際のISBNではありませんがデータフレームを作ってみました。
このISBNの列の数値を任意の区切り位置で切り離したいというのが趣旨です。


import pandas as pd
import numpy as np 
np.random.seed(seed=1)
val = np.random.randint(0,1000000000000, size=16).reshape(4,4)
df = pd.DataFrame(val, index=['e','f', 'g', 'h'],
                  columns=['a', 'b', 'ISBN', 'd'])
df


0

2Answer

固定桁の取り出しでしたら、以下のように、スライスを使用してはいかがでしょうか。

isbn = '978-4873117782'
code = isbn[7:-1]
print(code)

isbn[7:-1]は、「isbnの左端を7文字削り、右端を1文字削った残り」みたいな意味です。(4文字目のハイフンも1文字に数えます。)

なお、isbnは、最初からstrではないでしょうか。
もし、上記の冒頭を、isbn = 978-4873117782としてしまうと、isbn-4873116804になってしまいます。

追記

追記された内容に対する回答例になります。

code = [d[7:-1] for d in df['ISBN']]
print(code)

ただし、ISBN列が、(サンプルデータを生成されているコードとは異なり、)正しく978-4873117782の形式であることが前提となります。
例えば、元のコードの最後にdf['ISBN'] = '978-4873117782'と入れていただいて、その後に上記を実行すれば、正しく機能します。

以下のようにも書けます。

code = df['ISBN'].apply(lambda d: d[7:-1])
0Like

Comments

  1. ご回答ありがとうございます。1行だとそのやり方でいいと思うのですが、データフレームに対する列全体に対してだとどのようなコードになるでしょうか。
    質問書き直しました。
  2. 行列データはどのように作られているのでしょうか?
    例えば、「pandasのdataframeになっている」ですとか、そういった情報があると、回答が得やすいと思います。
  3. 初心者で恐縮です。pandasのデータフレームになっている状態です。
  4. 元の回答に追記させていただきました。
  5. ありがとうございました。データ型の変換等まだよくわかっていないのでいただいたコードで勉強します。

文字列として扱うならこんな感じでしょうか

print(df['ISBN'].astype('str').str.extract('\d{6}(\d+)\d{1}'))
0Like

Comments

  1. ありがとうございました。こちらのコードだとすぐ区切りができました。

Your answer might help someone💌