プロが教えるわが家の防犯対策術!

文字列データを数値データに変換する方法について教えてください。
下記のコードで、pandasでデータを読み込んで、特定のカラムの特定の行と列を抽出しているのですが、
import pandas as pd
data = pd.read_csv("XXXXX.txt",sep='\t',header=None)
a_list = data[data[2]=='chr1']
exonStarts = a_list.iloc[10,9].split(',')
exonStarts

出力はこうなります。
['34610', '35276', '35720', '']

.astype(int)を使って変換できるとありましたが、うまくできません。
どなたかわかる方宜しくお願い致します。

A 回答 (3件)

No.1です。


お礼に対して。

数値に変換できないもの
・そもそも数値ではない英字(eは指数としてやり方によっては判断されるかもですが)。
・数字と英字の混合
・全角文字で数字にならないもの(ひらがな・カタカナ・漢字【漢数字については調べ切れてません】)。
・あとはキーボードに点在する記号類(その中で通常使用される +,-,. などは省かれる【それ以外についてはテストしてみてって所も】)

pandas につきましてはそもそもが python 自体インストールはしていても『Pythonの絵本』を10ページ眺めた程度なので、拡張モジュールについては
その都度ググって検索されたサイトを見て改良してみる(稀に挫折する)位の浅い知識です。
なのでエラーの理由と言う点では何とも言えませんが、
>.astype(int)
の事であるなら数値化できない文字列の存在有りかなってレベルです。
あとは数値リストにしたのにやっているって訳ではないですよね?
    • good
    • 0
この回答へのお礼

教えて頂いた方法で数値に変換できました。ありがとうございました。

お礼日時:2019/12/05 15:21

> あと、astypeが使えないのは何故でしょうか?


> strにこのatributionは含まれないというエラーが出ます。

a_list.iloc[10,9]で取り出したのが "34610,35276,35720,"という文字列(str)だからです。
astype() は、pandas.DataFrame型のクラスで使用可能なメソッドであり、str型では使用できません。

pandas.DataFrame.astype
https://pandas.pydata.org/pandas-docs/stable/ref …


XXXXX.txt内の
前略(tab)34610,35276,35720,(tab)後略 から
[34610, 35276, 35720]という結果を得たいのであれば、
No.1さんの方法で取得するしかないと思います。
    • good
    • 1

まずリストの最後に '' が存在(数値に変換できないもの)するので一括変換(使った経験はないですけど)ができない点に注意しましょう。



取り合えずそれを除外し数字から数値のリストにするなら、

exonStarts = ['34610', '35276', '35720', '']
exonStarts = [int(x) for x in exonStarts if x.isnumeric()]
print(exonStarts) #[34610, 35276, 35720]

でも出来ます。
ただし文字列として存在する中で変換できるのは『正負の符号がなく小数点のない正の整数』ですね。
もし負の数値や小数点のある数値をって場合は、別途関数の作成が必要になるでしょう。

https://www.python.ambitious-engineer.com/archiv …
    • good
    • 0
この回答へのお礼

いつもありがとうございます。
整数のみのデータセットになります。最後に残ってた"はそういう意味だったんですね。
数値に変換出来ないものとは、例えば何が考えられるのでしょうか?
除去する方法も分からないのですが。。。
あと、astypeが使えないのは何故でしょうか?
strにこのatributionは含まれないというエラーが出ます。

お礼日時:2019/11/25 07:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!