質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

Q&A

解決済

3回答

812閲覧

特定の列の出現率を各列集計する

midsum0323

総合スコア40

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

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

0グッド

1クリップ

投稿2021/02/04 05:07

例えば以下のようなpandas.DataFrameの表がある場合に
df
|state|a|b|c|
| ---- | ---- |
|0|0|0|1|
|0|0|1|1|
|1|0|1|1|
|1|1|1|0|

以下のようにa,b,cの0,1ごとのstate=1の出現率を計算させたいです。
||0|1|
| ---- | ---- |
|a|0.33|1|
|b|0|0.67|
|c|1|0.33|

やったこと

python

1df.groupby('state').apply(lambda d: d.sum())

これだとstateの0,1ごとに各列の1の出現率となり、やりたいことと違うのはわかるのですが、
そのあとどうすればいいかわかりません

環境

Python 3.8.5
Pandas 1.1.3

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

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

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

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

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

guest

回答3

0

np.bincount()を使ってはどうでしょうか。

python

1df 2# state a b c 3# 0 0 0 0 1 4# 1 0 0 1 1 5# 2 1 0 1 1 6# 3 1 1 1 0 7 8 9def weight_mean(arr, weights): 10 return np.bincount(arr, weights=weights) / np.bincount(arr) 11 12df[['a', 'b', 'c']].apply(weight_mean, weights=df['state']).T 13# 0 1 14# a 0.333333 1.000000 15# b 0.000000 0.666667 16# c 1.000000 0.333333

投稿2021/02/04 06:34

kirara0048

総合スコア1399

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

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

midsum0323

2021/02/04 06:40

ありがとうございます。解決しました。
jeanbiego

2021/02/04 06:47

>kirara0048さん 素晴らしい。bincountという関数は知りませんでしたが、それ一つで0/1をカウントしつつ重み付けで平均もどきを取っちゃうのは巧みですね。
guest

0

短く書こうとしてたら出遅れた。

Python

1import pandas as pd 2import io 3 4txt = """ 5state,a,b,c 60,0,0,1 70,0,1,1 81,0,1,1 91,1,1,0 10""" 11 12df = pd.read_csv(io.StringIO(txt)) 13 14cols = [x for x in df.columns if x != "state"] 15df2 = pd.DataFrame([df.groupby(x)['state'].mean() for x in cols], index=cols) 16print(df2)

result

1 0 1 2a 0.333333 1.000000 3b 0.000000 0.666667 4c 1.000000 0.333333

投稿2021/02/04 06:32

Daregada

総合スコア11990

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

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

midsum0323

2021/02/04 06:41

ありがとうございます。解決しました。
guest

0

ベストアンサー

下記のような処理でしょうか。(前半はテストデータ作ってるだけなので、後半だけ見てください)

python3

1import io 2import pandas as pd 3 4data = """state a b c 50 0 0 1 60 0 1 1 71 0 1 1 81 1 1 0""" 9 10df = pd.read_table(io.StringIO(data), delimiter="\s+", index_col="state") 11 12 13# ここから処理 14df = df.reset_index() 15print(df) 16# state a b c 17# 0 0 0 0 1 18# 1 0 0 1 1 19# 2 1 0 1 1 20# 3 1 1 1 0 21results = {} 22for col in df.columns: 23 if col == "state": 24 continue 25 ratio = df.groupby(col).mean() 26 results[col] = ratio["state"] 27df_results = pd.DataFrame(results) 28print(df_results) 29# 0 1 30# a 0.333333 1.000000 31# b 0.000000 0.666667 32# c 1.000000 0.333333

投稿2021/02/04 05:39

編集2021/02/04 05:50
jeanbiego

総合スコア3966

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

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

midsum0323

2021/02/04 06:25

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問