Pandasデータフレーム内の異なる長さのプレフィックスと一貫性のない区切り文字を持つ列値からの共通のプレフィックスによってデータをグループ化して合計します

シド

私はPythonとPandasを初めて使用しますが、私のレポートのためにデータのクリーニング/マージの一部を自動化しようとしています。これまでのところ、レポートの概要に入力する必要のあるすべての情報の結合ファイルを作成することに成功しましたが、一致するプレフィックスを持つデータのグループ化とマージに行き詰まりました。

pandasデータフレームにこれと同様に構造化されたデータセットがあります。

Company_Num     Company_Name                2019_Amt    2020_Amt    Code    Flag    Manager

1               ABC Company Ltd             2000        400         A       Y       John
1               ABC Company Ltd             2000        400         A       Y       John
2               DEFGHIJ Company (London)    480         100         B       N       James
3               DEFGHIJ Company (Bristol)   600         700         B       N       James
4               DEFGHIJ Company (York)      1500        1000        B       N       James       
5               KLM Services                9000        7000        A       Y       Jane   
6               NOPQ Industries             300         400         C       Y       Jen   
7               NOPQ Industries - London    7000        8000        C       Y       Jen      

データに重複がなく、オフィスごとに行を作成する代わりに、会社ごとに1つの要約値を設定したデータの要約セットを取得したいと考えています。最終的には、次のようなデータフレームを使用します。

Company_Name            2019_Amt    2020_Amt    Code    Flag
ABC Company Ltd         2000        400         A       Y   
DEFGHIJ Company         2580        1800        B       N   
KLM Services            9000        7000        A       Y   
NOPQ Industries         7300        8400        C       Y 

これまでのところ、以下を使用して重複を削除することができました。

df.drop_duplicates(subset=['Company_Num', 'Company_Name', 'Code', '2019_Amt', '2020_Amt'])

結果のテーブルで:

Company_Num     Company_Name                2019_Amt    2020_Amt    Code    Flag    Manager
1               ABC Company Ltd             2000        400         A       Y       John
2               DEFGHIJ Company (London)    480         100         B       N       James
3               DEFGHIJ Company (Bristol)   600         700         B       N       James
4               DEFGHIJ Company (York)      1500        1000        B       N       James       
5               KLM Services                9000        7000        A       Y       Jane
6               NOPQ Industries             300         400         C       Y       Jen   
7               NOPQ Industries - London    7000        8000        C       Y       Jen              

私が試した解決策は、各会社名の最初の9文字を部分文字列にし、groupbyを使用してそれらを合計することですが、列は部分文字列として保存されたままになります。これにより、データフレームからCode列とFlag列も削除され、次のようなテーブルが残ります。

df['SubString_Company_Name'] = df['Company_Name'].str.slice(0,9)
df.groupby([df.SubString_Company_Name]).sum().reset_index()
SubString_Company_Name    2019_Amt    2020_Amt    
ABC Compa                 2000        400
DEFGHIJ C                 2580        1800   
KLM Servi                 9000        7000
NOPQ Indu                 7300        8400

os.path.commonprefix関数を使用して会社名を取得しようとしましたが、データフレームや複数の値で使用する方法が見つかりません。私の理解では、リスト全体を見て、機能しないリスト全体の最長の共通プレフィックスを返します。また、重複するすべての部分文字列を新しいデータフレームに抽出し、そこで合計して名前を変更してから、1つのデータセットにマージすることも検討しましたが、それが機能するかどうかはわかりません。私がオンラインで見つけたソリューションは、ラムダを区切り文字とともに使用できる、またはプレフィックスが常に同じサイズである均一なデータを中心にしていますが、私のデータは均一ではなく、プレフィックスはさまざまなサイズです。

私のデータは毎月変更されるので、9文字しか使用できないという問題が発生する可能性があるため、部分文字列に依存しない動的なソリューションを設計したいと思います。私の最後の考慮事項は、SubString_Company_Nameをリストに抽出し、それをCompany_Nameのos.path.commonprefixに変換してから、各Company_Nameの一意のcommonprefix値を新しいリストに保存し、そのリストの各項目に対して新しい要約テーブルを作成することです。 。しかし、これが機能するかどうかはわかりません。試す前に、これを行うためのより良い方法またはより効率的な方法があるかどうかを知りたいと思います。

アンキー

groupby.agg重複を削除した後に使用series.str.splitし、分割の最初の文字列を.str[0]グルーパーとして使用できます

d= {'Company_Name':'first','2019_Amt':'sum','2019_Amt':'sum',
               '2020_Amt':'sum','Code':'first','Flag':'first'}
grouper = df['Company_Name'].str.split().str[0]

out = df.drop_duplicates().groupby(grouper).agg(d).reset_index(drop=True)
print(out)

               Company_Name  2019_Amt  2020_Amt Code Flag
0           ABC Company Ltd      2000       400    A    Y
1  DEFGHIJ Company (London)      2580      1800    B    N
2              KLM Services      9000      7000    A    Y
3           NOPQ Industries      7300      8400    C    Y

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ