私は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]
コメントを追加