TL; DRバージョン:
単純な場合:
- 区切り文字付きのテキスト列があり、2つの列が欲しい
最も簡単な解決策は次のとおりです。
df['A'], df['B'] = df['AB'].str.split(' ', 1).str
または、次のようにして、スプリットのエントリごとに1列のデータフレームを自動的に作成できます。
df['AB'].str.split(' ', 1, expand=True)
expand=True
文字列に不均一な数の分割があり、必要な場合に使用する必要がありますNone
、欠損値を置き換える。
どちらの場合も、.tolist()
メソッドが不要であることに注意してください。どちらでもないzip()
。
詳細に:
アンディヘイデンのソリューションは、str.extract()
メソッドのます。
しかし、既知のセパレーター(ダッシュによる分割や空白による分割など)を単純に分割する.str.split()
場合は、この方法で十分です1。文字列の列(シリーズ)を操作し、リストの列(シリーズ)を返します。
>>> import pandas as pd
>>> df = pd.DataFrame({'AB': ['A1-B1', 'A2-B2']})
>>> df
AB
0 A1-B1
1 A2-B2
>>> df['AB_split'] = df['AB'].str.split('-')
>>> df
AB AB_split
0 A1-B1 [A1, B1]
1 A2-B2 [A2, B2]
1:最初の2つのパラメーターの内容がわからない場合は、メソッドのプレーンPythonバージョンの.str.split()
ドキュメントをお勧めします。
しかし、どうやって行くのですか:
に:
さて、私たちはを詳しく見る必要があります .str
列の属性をがあります。
これは、列の各要素を文字列として扱い、可能な限り効率的に各要素にそれぞれのメソッドを適用するメソッドを収集するために使用される魔法のオブジェクトです。
>>> upper_lower_df = pd.DataFrame({"U": ["A", "B", "C"]})
>>> upper_lower_df
U
0 A
1 B
2 C
>>> upper_lower_df["L"] = upper_lower_df["U"].str.lower()
>>> upper_lower_df
U L
0 A a
1 B b
2 C c
ただし、文字列の各要素をインデックスで取得するための「インデックス」インターフェイスも備えています。
>>> df['AB'].str[0]
0 A
1 A
Name: AB, dtype: object
>>> df['AB'].str[1]
0 1
1 2
Name: AB, dtype: object
もちろん、このインデックスインターフェイスは.str
、インデックスを付けることができる限り、そのインデックスを作成する各要素が実際に文字列であるかどうかを気にしません。
>>> df['AB'].str.split('-', 1).str[0]
0 A1
1 A2
Name: AB, dtype: object
>>> df['AB'].str.split('-', 1).str[1]
0 B1
1 B2
Name: AB, dtype: object
次に、実行するイテラブルのPythonタプルアンパックを利用するのは簡単です。
>>> df['A'], df['B'] = df['AB'].str.split('-', 1).str
>>> df
AB AB_split A B
0 A1-B1 [A1, B1] A1 B1
1 A2-B2 [A2, B2] A2 B2
もちろん、文字列の列の分割からDataFrameを取得するのは非常に便利なので、.str.split()
メソッドはexpand=True
パラメーターを使用してそれを実行できます。
>>> df['AB'].str.split('-', 1, expand=True)
0 1
0 A1 B1
1 A2 B2
したがって、私たちが望んでいたことを達成する別の方法は、次のようにすることです。
>>> df = df[['AB']]
>>> df
AB
0 A1-B1
1 A2-B2
>>> df.join(df['AB'].str.split('-', 1, expand=True).rename(columns={0:'A', 1:'B'}))
AB A B
0 A1-B1 A1 B1
1 A2-B2 A2 B2
expand=True
バージョンは、より長いが、タプル開梱方法を超える明確な利点を有します。タプルのアンパックは、異なる長さの分割をうまく処理しません。
>>> df = pd.DataFrame({'AB': ['A1-B1', 'A2-B2', 'A3-B3-C3']})
>>> df
AB
0 A1-B1
1 A2-B2
2 A3-B3-C3
>>> df['A'], df['B'], df['C'] = df['AB'].str.split('-')
Traceback (most recent call last):
[...]
ValueError: Length of values does not match length of index
>>>
しかしexpand=True
、None
十分な「スプリット」がない列に配置することで、うまく処理します。
>>> df.join(
... df['AB'].str.split('-', expand=True).rename(
... columns={0:'A', 1:'B', 2:'C'}
... )
... )
AB A B C
0 A1-B1 A1 B1 None
1 A2-B2 A2 B2 None
2 A3-B3-C3 A3 B3 C3
read_table()
またはread_fwf()