🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

1692閲覧

【python pandas】データフレームの結合(補完?)がうまくできない

KooToo

総合スコア6

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2021/02/06 12:12

下記の2つのデータフレームをpandasで結合したいのですが、処理が完了せずうまくいきません。
そもそも結合?で正しいのか含め、教えていただけると幸いです。

【やりたいこと】

次のような2つのデータフレームがあります。

df1 :月毎の支払い

部署人数予算
1月第1人事室31
2月第1人事室101
1月第2人事室62
1月外注室98
1月第1総務室32
1月第2総務室71

部署列には〇〇室というデータが入っているのですが、
これより大きなくくりの〇〇部で集計したく、df2の結合を試みました。

df2 :〇〇室が何部に属するか

部署
第1人事室人事部
第2人事室人事部
外注室人事部
第1総務室総務部
第2総務室総務部

これを結合して次のようにしたいです。
df3

部署人数予算
1月第1人事室31人事部
2月第1人事室101人事部
1月第2人事室62人事部
1月外注室98人事部
1月第1総務室32総務部
1月第2総務室71総務部

注:df1とdf2は列数も行数も違ってます。

【試したこと】

python

1df3 = pd.concat([df1, df2], axis=1) 2#これを実行すると、エラーは出ないのですが、処理が完了せず延々実行したままになります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

pandas.merge使うだけでOK。

pandas.DataFrameを結合するmerge, join(列・インデックス基準) | note.nkmk.me

Python

1import pandas as pd 2import io 3 4txt1 = """ 5月,部署,人数,予算 61月,第1人事室,3,1 72月,第1人事室,10,1 81月,第2人事室,6,2 91月,外注室,9,8 101月,第1総務室,3,2 111月,第2総務室,7,1 12""" 13 14txt2 = """ 15部署,部 16第1人事室,人事部 17第2人事室,人事部 18外注室,人事部 19第1総務室,総務部 20第2総務室,総務部 21""" 22 23pd.set_option('display.unicode.east_asian_width', True) 24 25df1 = pd.read_csv(io.StringIO(txt1)) 26df2 = pd.read_csv(io.StringIO(txt2)) 27 28df3 = pd.merge(df1, df2, on='部署') 29print(df3)

result

1 月 部署 人数 予算 部 20 1月 第1人事室 3 1 人事部 31 2月 第1人事室 10 1 人事部 42 1月 第2人事室 6 2 人事部 53 1月 外注室 9 8 人事部 64 1月 第1総務室 3 2 総務部 75 1月 第2総務室 7 1 総務部

投稿2021/02/06 13:37

編集2021/02/06 13:39
Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KooToo

2021/02/09 00:15

ありがとうございます。無事できました!
guest

0

結合とかを考えずに、辞書とapplyでやったほうが早いように思います。

pyhon

1>>> import pandas as pd 2>>> import io 3>>> 4>>> org_d = { 5... '第1人事室':'人事部', 6... '第2人事室':'人事部', 7... '外注室':'人事部', 8... '第1総務室':'総務部', 9... '第2総務室':'総務部'} 10>>> 11>>> 12>>> indata = '''月 部署 人数 予算 13... 1月 第1人事室 3 1 14... 2月 第1人事室 10 1 15... 1月 第2人事室 6 2 16... 1月 外注室 9 8 17... 1月 第1総務室 3 2 18... 1月 第2総務室 7 1''' 19>>> 20>>> with io.StringIO(indata) as f: 21... df = pd.read_csv(f, sep=' ') 22... 23>>> print(df) 24 月 部署 人数 予算 250 1月 第1人事室 3 1 261 2月 第1人事室 10 1 272 1月 第2人事室 6 2 283 1月 外注室 9 8 294 1月 第1総務室 3 2 305 1月 第2総務室 7 1 31>>> 32>>> org_d = { 33... '第1人事室':'人事部', 34... '第2人事室':'人事部', 35... '外注室':'人事部', 36... '第1総務室':'総務部', 37... '第2総務室':'総務部'} 38>>> 39>>> df['部'] = df['部署'].apply(lambda x: org_d[x]) 40>>> print(df) 41 月 部署 人数 予算 部 420 1月 第1人事室 3 1 人事部 431 2月 第1人事室 10 1 人事部 442 1月 第2人事室 6 2 人事部 453 1月 外注室 9 8 人事部 464 1月 第1総務室 3 2 総務部 475 1月 第2総務室 7 1 総務部

投稿2021/02/06 12:36

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KooToo

2021/02/09 00:16

ありがとうございます。無事できました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問