データフレームの文字列列を 2 つの列に分割するにはどうすればよいでしょうか? 質問する

データフレームの文字列列を 2 つの列に分割するにはどうすればよいでしょうか? 質問する

fips'1つの(文字列)列を持つデータフレームがあり、それを2つの(文字列)列に分割し、1つの列ヘッダーを「」にし、もう1つを「」にしたいです。'row'

私のデータフレームはdf次のようになります:

          row
0    00000 UNITED STATES
1    01000 ALABAMA
2    01001 Autauga County, AL
3    01003 Baldwin County, AL
4    01005 Barbour County, AL

df.row.str[:]行セルを分割するという目的を達成するために をどのように使用すればよいかわかりません。 を使用してdf['fips'] = hello新しい列を追加し、 を入力することができますhello。何かアイデアはありますか?

         fips       row
0    00000 UNITED STATES
1    01000 ALABAMA 
2    01001 Autauga County, AL
3    01003 Baldwin County, AL
4    01005 Barbour County, AL

ベストアンサー1

TL;DRバージョン:

次のような単純なケースの場合:

  • 区切り文字付きのテキスト列があり、2つの列が必要です

最も簡単な解決策は次のとおりです。

df[['A', 'B']] = df['AB'].str.split(' ', n=1, expand=True)

expand=True文字列に不均一な数の分割があり、None欠落した値を置き換える場合は、 を使用する必要があります。

どちらの場合でも、.tolist()メソッドは必要ないことに注目してください。 も必要ありませんzip()

詳細に:

アンディ・ヘイデンの解決策の力を示すのに最も優れていますstr.extract()方法。

しかし、既知の区切り文字による単純な分割(ダッシュによる分割や空白による分割など)の場合、.str.split()メソッドは十分です1。文字列の列 (Series) を操作し、リストの列 (Series) を返します。

>>> 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つのパラメータが何をするのか分からない場合は.str.split()メソッドの単純なPythonバージョン

しかし、どうすれば次のようになるのでしょうか:

  • 2つの要素のリストを含む列

に:

  • 2 つの列があり、それぞれにリストのそれぞれの要素が含まれていますか?

.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('-', n=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('-', n=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('-', n=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

おすすめ記事