69490


やりたいことは、２つのファイルを加工し、vlook的なことをやりたいとおもっております。  
環境はminiconda、jupyternotebookです。  
追加質問；  
一通りできるようになったのですが、outoputファイルが、いまいちの状態です。  
①一番左の連番は不要  
②Unnamed:の列は不要  
にて出力するには、どのような処理があるでしょうか？

二つのファイルの内容です。  
shrink.csv,,,,,,,,,,,,,,,,,,,,,,,

[code]

    伝票日付,得意先法人コード,得意先法人検索名,得意先コード,得意先検索名,仕入先法人コード,仕入先法人検索名,仕入先コード,仕入先検索名,支払先法人コード,商品コード,品名,メモ欄,ケース入数,備考,数量,数量単位,売上単価,売上金額,仕入単価,仕入金額,定義番号,外部データフォーマット名,バッチ番号
    20000701,999999,国語株式会社,19993342,国語株式会社,19993931,算数産業株式会社,11682827,算数産業株式会社　本社,19993931,22548,理科１,社会,2,変更,3,ｍ,1000,3000,500,1500,1,5,99
    20000702,501998,国語株式会社,19993343,道徳株式会社,19993931,算数産業株式会社,11682827,算数産業株式会社　本社,19993931,22734,理科２,社会,2,変更,3,ｍ,1000,3000,500,1500,2,6,52
    20000703,501998,国語株式会社,19993344,英語株式会社,19993931,算数産業株式会社,11682827,算数産業株式会社　本社,19993931,22735,理科３,社会,2,変更,5,ｍ,1000,5000,500,2500,3,6,36
    ,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,,,,,,,,,,,,
    ,,,,,,,,,,,,,,,,,,,,,,,
    
[/code]

tantou.csv,,,,,,,,,,,,,,,,,,,,,,,

[code]

    №,法人,得意先コード,得意先名,担当,カテゴリー,チーム,,,,,,,,,,,,,,,,,
    1,999999,19993342,国語株式会社,うさぎ,サクサク,かりんとう,,,,,,,,,,,,,,,,,
    2,501998,19993343,道徳株式会社,かめ,もっちり,だんご,,,,,,,,,,,,,,,,,
    3,501998,19993344,英語株式会社,あり,すっきり,りんご,,,,,,,,,,,,,,,,,
    
[/code]

過去に行った関連質問を元に下記のように書いてみましたが、エラーが出てしまいます。  
[Pythonでvlookupをしたい](https://ja.stackoverflow.com/q/69403)

[code]

    #【Python】CSVファイルを読み込み、列を追加する方法
    import pandas as pd
    df = pd.read_csv('shrink.csv', encoding="CP932")
    
    #4末尾の列に追加する方法はサンプルコードや下記の記述となります。
    df["月度"] = df["伝票日付"].astype(str).str[:6]
       
    #得意先コードをキーにして結合する
    df_code = pd.read_csv('tantou.csv', encoding="CP932")
    df = pd.merge(df, df_code, how="left", on="得意先コード")
    
    # 末尾列に2列の引き算を配置する
    df["売総"] = df["売上金額"] - df["仕入金額"]
    
    df.to_csv('categoryad.csv', encoding="CP932")
    
[/code]

しかし、エラーメッセージ(You are trying to merge on int64 and object
columns)がでたので、皆様から頂いた内容を踏まえて、tantouファイルを見たところ、漢字が含まれていたので削除しました。おかげさまで、なんとかアウトプットまでできました。ありがとうございます。

しかし、挿入した列が元のshrink.csvの内容からかなり離れた列に挿入されておりました。おそらくtantou.csvのデーターの最右にカンマだけの列が含まれていることが原因かと思います。あと、もう少し、と思います。お力添えお願いします。

結果出力ファイル

[code]

    ,伝票日付,得意先法人コード,得意先法人検索名,得意先コード,得意先検索名,仕入先法人コード,仕入先法人検索名,仕入先コード,仕入先検索名,支払先法人コード,商品コード,品名,メモ欄,ケース入数,備考,数量,数量単位,売上単価,売上金額,仕入単価,仕入金額,定義番号,外部データフォーマット名,バッチ番号,月度,№,法人,得意先名,担当,カテゴリー,チーム,Unnamed: 7,Unnamed: 8,Unnamed: 9,Unnamed: 10,Unnamed: 11,Unnamed: 12,Unnamed: 13,Unnamed: 14,Unnamed: 15,Unnamed: 16,Unnamed: 17,Unnamed: 18,Unnamed: 19,Unnamed: 20,Unnamed: 21,Unnamed: 22,Unnamed: 23,Unnamed: 24,Unnamed: 25,Unnamed: 26,Unnamed: 27,Unnamed: 28,Unnamed: 29,Unnamed: 30,Unnamed: 31,Unnamed: 32,Unnamed: 33,Unnamed: 34,Unnamed: 35,Unnamed: 36,Unnamed: 37,Unnamed: 38,Unnamed: 39,Unnamed: 40,Unnamed: 41,Unnamed: 42,Unnamed: 43,Unnamed: 44,Unnamed: 45,Unnamed: 46,Unnamed: 47,Unnamed: 48,Unnamed: 49,Unnamed: 50,Unnamed: 51,Unnamed: 52,Unnamed: 53,Unnamed: 54,Unnamed: 55,Unnamed: 56,Unnamed: 57,売総
    0,20000701,999999,国語株式会社,19993342,国語株式会社,19993931,算数産業株式会社,11682827,算数産業株式会社　本社,19993931,22548,理科１,社会,2,変更,3,ｍ,1000,3000,500,1500,1,5,99,202007,5,999999,国語株式会社,パンダ,船,英和,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,666
    1,20000702,501998,国語株式会社,19993343,道徳株式会社,19993931,算数産業株式会社,11682827,算数産業株式会社　本社,19993931,22734,理科２,社会,2,変更,3,ｍ,1000,3000,500,1500,2,6,52,202007,5,999999,国語株式会社,パンダ,船,英和,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,667
    2,20000703,501998,国語株式会社,19993344,英語株式会社,19993931,算数産業株式会社,11682827,算数産業株式会社　本社,19993931,22735,理科３,社会,2,変更,5,ｍ,1000,5000,500,2500,3,6,36,202007,5,999999,国語株式会社,パンダ,船,英和,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,668
    
[/code]


CC BY-SA 4.0
2020-08-12T06:49:46.383
69474
2020-08-13T02:37:47.167
2020-08-13T02:37:47.167
question
python csv
Pythonでvlookupをしたい3


**①一番左の連番は不要**  
これはDataFrameのindexが出力されているためなので、`.to_csv()`の中で`index=False`を指定すれば良いでしょう。  
[pandas.DataFrame.to_csv](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.DataFrame.to_csv.html)

[code]

    df.to_csv('categoryad.csv', encoding="CP932",index=False)
    
[/code]

**②Unnamed:の列は不要**  
これは質問のとおりカンマだけの列があることが原因でしょう。  
以下のいずれかで処理できるでしょう。

**1.それぞれのDataFrameに`.dropna()`処理をする**  
[pandas.DataFrame.dropna](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.DataFrame.dropna.html)

[code]

    df_code = pd.read_csv('tantou.csv', encoding="CP932")
    df = pd.merge(df, df_code, how="left", on="得意先コード")
    
[/code]

上記2行の間に`.dropna()`を挿入する

[code]

    df_code = pd.read_csv('tantou.csv', encoding="CP932")
    df_code.dropna(axis=1,inplace=True)
    df = pd.merge(df, df_code, how="left", on="得意先コード")
    
[/code]

説明文のように`shrink.csv`の最右にカンマだけの列があるのなら、上記同様に`.read_csv()`の後に`.dropna()`を挿入する

[code]

    df = pd.read_csv('shrink.csv', encoding="CP932")
    df_code.dropna(axis=1,inplace=True)
    
[/code]

説明文が間違っていて、ファイル内容のように単独の行としてカンマだけの行があるのなら、`axis=1,`を含まない`.dropna()`を挿入する

[code]

    df = pd.read_csv('shrink.csv', encoding="CP932")
    df_code.dropna(inplace=True)
    
[/code]

**2.`Unnamed`を含まない列だけ抽出する**  
[Remove Unnamed columns in pandas dataframe
[duplicate]](https://stackoverflow.com/q/43983622/9014308)

[code]

    df["売総"] = df["売上金額"] - df["仕入金額"]
    
    df.to_csv('categoryad.csv', encoding="CP932",index=False)
    
[/code]

上記2行の間(csvファイルに出力する前)に`df = df.loc[:,
~df.columns.str.contains('^Unnamed')]`を挿入する

[code]

    df["売総"] = df["売上金額"] - df["仕入金額"]
    df = df.loc[:, ~df.columns.str.contains('^Unnamed')]
    df.to_csv('categoryad.csv', encoding="CP932",index=False)
    
[/code]


CC BY-SA 4.0
2020-08-12T09:56:10.397
69483
2020-08-12T09:56:10.397
26370
69474
answer


`shrink.csv` の様に、カラム内に空(empty)データが含まれている場合、数値データは `float64`型として読み込まれます。

[code]

    >>> import pandas as pd
    >>> df = pd.read_csv('shrink.csv', encoding='CP932').dropna(how='all')
    >>> df
           伝票日付     得意先法人コード 得意先法人検索名  ...  
    0  20000701.0          999999.0     国語株式会社  ...
    1  20000702.0          501998.0     国語株式会社  ...
    2  20000703.0          501998.0     国語株式会社  ...
    
[/code]

`read_csv()` で `dtypes` や `converters` パラメータでカラム毎に dtype
を指定すれば良いのですが、カラム数が多いので
[pandas.DataFrame.select_dtypes](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.DataFrame.select_dtypes.html) を使用して
`int64`型に変更します。

[code]

    >>> df = pd.read_csv('shrink.csv', encoding='CP932').dropna(how='all')
    >>> df = df.astype({
          c: 'int64' for c in df.select_dtypes(include='float64').columns
        })
    >>> df
        伝票日付      得意先法人コード  得意先法人検索名  ...
    0  20000701            999999     国語株式会社  ...
    1  20000702            501998     国語株式会社  ...
    2  20000703            501998     国語株式会社  ...
    
[/code]

`tantou.csv` も同様に変更します。

[code]

    import pandas as pd
    df = pd.read_csv('shrink.csv', encoding='CP932').dropna(how='all')
    df = df.astype({
      c: 'int64' for c in df.select_dtypes(include='float64').columns
    })
    
    df['月度'] = df['伝票日付'].astype(str).str[:6]
    
    df_code = pd.read_csv('tantou.csv', encoding='CP932').dropna(axis='columns', how='all')
    df_code = df_code.astype({
      c: 'int64' for c in df_code.select_dtypes(include='float64').columns
    })
    
    df = pd.merge(df, df_code, how='left', on='得意先コード')
    df['売総'] = df['売上金額'] - df['仕入金額']
    
    df.to_csv('categoryad.csv', encoding='CP932', index=False)
    
[/code]

**categoryad.csv**

[code]

    伝票日付,得意先法人コード,得意先法人検索名,得意先コード,得意先検索名,仕入先法人コード,仕入先法人検索名,仕入先コード,仕入先検索名,支払先法人コード,商品コード,品名,メモ欄,ケース入数,備考,数量,数量単位,売上単価,売上金額,仕入単価,仕入金額,定義番号,外部データフォーマット名,バッチ番号,月度,,法人,得意先名,担当,カテゴリー,チーム,売総
    20000701,999999,国語株式会社,19993342,国語株式会社,19993931,算数産業株式会社,11682827,算数産業株式会社　本社,19993931,22548,理科１,社会,2,変更,3,ｍ,1000,3000,500,1500,1,5,99,200007,1,999999,国語株式会社,うさぎ,サクサク,かりんとう,1500
    20000702,501998,国語株式会社,19993343,道徳株式会社,19993931,算数産業株式会社,11682827,算数産業株式会社　本社,19993931,22734,理科２,社会,2,変更,3,ｍ,1000,3000,500,1500,2,6,52,200007,2,501998,道徳株式会社,かめ,もっちり,だんご,1500
    20000703,501998,国語株式会社,19993344,英語株式会社,19993931,算数産業株式会社,11682827,算数産業株式会社　本社,19993931,22735,理科３,社会,2,変更,5,ｍ,1000,5000,500,2500,3,6,36,200007,3,501998,英語株式会社,あり,すっきり,りんご,2500
    
[/code]


CC BY-SA 4.0
2020-08-12T11:21:44.017
69490
2020-08-12T11:21:44.017
69474
answer