bugfix> python > 投稿

日付と会社名の2つの変数が格納されているこの1つの列があります。私の目標は、これら2つの変数を2つの列に分けることです。

date_time/full_company_name

  • 2020-05-19ロペス-ウォレス
  • 2020-05-12スミス-サイモン
  • 2020-10-02Jenkins Inc
  • 2020-07-06ムーア-ワイス

これまでの私のアプローチは次のとおりです。

df['date_time'] = [i[:10] for i in df['date_time/full_company_name']]
df['full_company_name'] = [i[10:] for i in df['date_time/full_company_name']]
df.drop('date_time/full_company_name', axis=1, inplace=True)

上記のコードはうまく機能しましたが、データセットには次のような失敗したデータエントリがいくつかあります。

  • 0ロペス、バートン、ジョーンズ
  • NaNBrown、Singleton、Harrell
  • 84635ボールトーマス

例外を処理するために一連のifステートメントを含むループを使用したり、文字列に何らかの区切り文字を挿入してから使用したりするなど、いくつかの可能な解決策について考えました。 string.split('_') 。ただし、これらの回避策はかなり面倒です。

もっと一般的な関数やメソッドがそこにあるのだろうかと思わずにはいられません。

回答 1 件
  • 一般に、パンダシリーズまたはデータフレームのコンテンツを反復処理するとパフォーマンスが低下します。代わりに、可能な場合はベクトル化されたアプローチをお勧めします。

    Iterating through pandas objects is generally slow. In many cases, iterating manually over the rows is not needed and can be avoided...

    ドキュメントを参照してください。

    そうは言っても、「失敗していない」エントリの場合は、次のようにすることができます。

    df['date_time'] = df['date_time/full_company_name'].str.slice(0, 10)
    df['full_company_name'] = df['date_time/full_company_name'].str.slice(10, None)
    df.drop('date_time/full_company_name', axis=1, inplace=True)
    
    

    失敗したエントリの場合、一貫したパターンがない場合、プログラムによるアプローチを思い付くのは難しいでしょうが、あなたの例で機能し、他の既知のエントリエラーで拡張できるものが使用されています extract 正規表現で:

    # The first capture group is either a Y-M-D date, the NaN string or a sequence of digits
    # The second one is any string
    pattern = r'(\d{4}-\d{2}-\d{2}|NaN|0|\d+)(.+)'
    df['date_time/full_company_name'].str.extract(pattern)
    
    

    出力:

               0                             1
    0  2020-05-19                 Lopez-Wallace
    1  2020-05-12                   Smith-Simon
    2  2020-10-02                   Jenkins Inc
    3  2020-07-06                   Moore-Weiss
    4           0       Lopez, Barton and Jones
    5         NaN  Brown, Singleton and Harrell
    6       84635                   Ball-Thomas
    
    

あなたの答え