web-dev-qa-db-ja.com

文字列の列をpandasのリストに変換します

pandasデータフレーム内の私の列のタイプに問題があります。基本的に、列はcsvファイルに文字列として保存されます。これをタプルとして使用して、数値のリストに変換するには、次のように非常に単純なcsvがあります。

ID,LABELS
1,"(1.0,2.0,2.0,3.0,3.0,1.0,4.0)"
2,"(1.0,2.0,2.0,3.0,3.0,1.0,4.0)"

関数「read_csv」でロードすると、文字列のリストが表示されます。リストに変換しようとしましたが、文字列のリストバージョンを取得します。

df.LABELS.apply(lambda x: list(x))

戻り値:

['(','1','.','0',.,.,.,.,.,'4','.','0',')']

それを行うことができる方法について何か考えはありますか?

ありがとうございました。

6
Guido Muscioni

あなたはタプルを与えるast.literal_evalを使うことができます:

import ast
df.LABELS = df.LABELS.apply(ast.literal_eval)

リストが必要な場合は、次を使用します。

df.LABELS.apply(lambda s: list(ast.literal_eval(s)))
2
llllllllll

使用する - str.strip および str.split

df['LABELS'] = df['LABELS'].str.strip('()').str.split(',')

ただし、ここにNaNsがない場合、list comprehensionうまくいきます:

df['LABELS'] = [x.strip('()').split(',') for x in df['LABELS']]
2
jezrael

これを試すことができます(csvfilename.csv):

df = pd.read_csv('filename.csv')

df['LABELS'] = df.LABELS.apply(lambda x: x.strip('()').split(','))

>>> df
   ID                               LABELS
0   1  [1.0, 2.0, 2.0, 3.0, 3.0, 1.0, 4.0]
1   2  [1.0, 2.0, 2.0, 3.0, 3.0, 1.0, 4.0]
1
sacuL

または、正規表現を検討することもできます。

pattern = re.compile("[0-9]\.[0-9]")
df.LABELS.apply(pattern.findall)
0
Yaakov Bressler