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

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

詳細はこちら
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

pandas

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

Q&A

解決済

2回答

8425閲覧

python pandas で割合を出したい

be_yaann

総合スコア12

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

pandas

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

0グッド

1クリップ

投稿2019/12/13 03:04

python でデータ分析を勉強中です。
CSV から取得したデータを使って各データの割合を出そうとしています。
データ全体を使った割引は出せるのですが、グループ化したデータを使って出すことが出来ません。
データ全体の割合は下記のように出しています。

python

1df = pd.read_csv('data/test.csv',encoding="utf-8") 2df_cond = df.loc[:, 'status'] 3df_cond.value_counts(normalize=True)

データの作りを変えれば value_counts で出せると思いますので、データの作り変え方についてご教授頂けないでしょうか。

元のデータ

notypestatus
1aoff
2aon
3aon
4aoff
5aoff
6boff
7bon
8boff
9boff
10boff
11coff

期待する戻り値

typestatus%
aon40
aoff60
bon20
boff80
coff100

詰まっている箇所
元のデータから下記のデータに変換する処理

abc
offoffoff
ononnan
onoffnan
offoffnan
offoffnan

pythonの勉強をはじめたところでソースが全く思い浮かびません。
よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Python

1ret = df.groupby('type')['status'].apply(lambda d: d.value_counts(normalize=True)*100) 2#a on 40.0 3# off 60.0 4#b on 20.0 5# off 80.0 6#c on 0.0 7# off 100.0 8#Name: status, dtype: float64

で良いかと思います。
ただし、上記の結果は MultiIndexのSeriesで得られますので、DataFrameに変換する必要があるのであれば

Python

1ret = ret.reset_index().rename(columns={'level_1':'status', 'status':'rate'}) 2# type status rate 3#0 a off 60.0 4#1 a on 40.0 5#2 b off 80.0 6#3 b on 20.0 7#4 c off 100.0

のようにIndexを剥がして Column名を修正するとよいのではないでしょうか。

投稿2019/12/13 04:34

magichan

総合スコア15898

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

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

be_yaann

2019/12/13 06:04

ありがとうございます。 意図した通りの結果をとれました。 またMultiIndexの処理の方法まで記載していただき、助かります
guest

0

Python

1>>> df.groupby(['type'])['status'].agg('value_counts', normalize=True) 2type status 3a off 0.6 4 on 0.4 5b off 0.8 6 on 0.2 7c off 1.0 8Name: status, dtype: float64

投稿2019/12/13 04:54

kirara0048

総合スコア1399

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

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

be_yaann

2019/12/13 06:03

ありがとうございます。 意図した通りの結果になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問