私はパンダで読むためにこの「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'
文字列を手動で分割できます:
>>> df['Tags'] = df.Tags.apply(lambda x: x[1:-1].split(','))
>>> df.Tags[0]
['Tag1', 'Tag2']
または
df.Tags=df.Tags.str[1:-1].str.split(',').tolist()
strip
およびsplit
を使用して、文字列をリストに変換できます。
df_out = df.assign(Tags=df.Tags.str.strip('[]').str.split(','))
df_out.Tags[0][0]
出力:
'Tag1'
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()
を呼び出し、リストの文字列表現を実際のリストに変換します。
あなたの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
がリストを分割するポイントとして扱います。