web-dev-qa-db-ja.com

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

私はパンダで読むためにこの「file.csv」ファイルを持っています:

Title|Tags
T1|"[Tag1,Tag2]"
T1|"[Tag1,Tag2,Tag3]"
T2|"[Tag3,Tag1]"

使用する

df = pd.read_csv('file.csv', sep='|')

出力は次のとおりです。

  Title              Tags
0    T1       [Tag1,Tag2]
1    T1  [Tag1,Tag2,Tag3]
2    T2       [Tag3,Tag1]

Tagsは完全な文字列であることを知っています。

In [64]: df['Tags'][0][0]
Out[64]: '['

["Tag1","Tag2"]のような文字列のリストとして読み取る必要があります。 this の質問で提供された解決策を試しましたが、実際に物事を混乱させる[および]文字があるため、そこでは運がありません。

予期される出力は次のとおりです。

In [64]: df['Tags'][0][0]
Out[64]: 'Tag1'
10
Fabio Lamanna

文字列を手動で分割できます:

>>> df['Tags'] = df.Tags.apply(lambda x: x[1:-1].split(','))
>>> df.Tags[0]
['Tag1', 'Tag2']
14
Mike Müller

または

df.Tags=df.Tags.str[1:-1].str.split(',').tolist()
5
YOBEN_S

stripおよびsplitを使用して、文字列をリストに変換できます。

df_out = df.assign(Tags=df.Tags.str.strip('[]').str.split(','))

df_out.Tags[0][0]

出力:

'Tag1'
3
Scott Boston

Jsonモジュールを使用できると思います。

_import json
import pandas

df = pd.read_csv('file.csv', sep='|')
df['Tags'] = df['Tags'].apply(lambda x: json.loads(x))
_

したがって、これは以前と同様にデータフレームをロードし、Tags列の各項目にラムダ関数を適用します。ラムダ関数はjson.loads()を呼び出し、リストの文字列表現を実際のリストに変換します。

2
RHSmith159

あなたのdf['Tags']は文字列のリストのようです。そのリストを印刷する場合、["[tag1,tag2]","[Tag1,Tag2,Tag3]","[Tag3,Tag1]"]を取得する必要があります。これが、最初の要素の最初の要素を呼び出すときに、文字列ではなく、文字列の最初の1文字を実際に取得する理由です。

後でその文字列を解析する必要があります。のような何かを行う

df['Tags'][0] = df['Tags'][0].split(',')

しかし、引用した例で見たように、これは次のようなリストを提供します

in: df['Tags'][0][0] 
out: '[tag1'`

必要なのは、文字列を解析して複数の文字を編集する方法です。これを行うには、単純な正規表現を使用できます。何かのようなもの:

 import re
 df['Tags'][0] = re.findall(r"[\w']+", df['Tags'][0])
 print(df['Tags'][0][0])

印刷されます:

 'tag1'

Pandasコンバーターを含む他の回答を使用すると、次のようなコンバーターを作成できます。

 def clean(seq_string):
      return re.findall(r"[\w']+", seq_string)

正規表現がわからない場合は非常に強力ですが、入力文字列の内容が不明な場合は予測できません。ここで使用される式r"[\w']+"は、一般的なWord文字の英数字とアンダースコアに一致し、それ以外のすべてをre.findallがリストを分割するポイントとして扱います。

1
Veggiet