1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Python(pandas)でファンチャートを作る

Last updated at Posted at 2021-10-10

0. はじめに

たまには小ネタ記事を。

よくテレビとかで出てくる「ある地点の**を100としたときに」っていうグラフがあります。
これファンチャートって言うらしいんですが、これをPandasのMap関数等でどう作成すればいいか?にお恥ずかしながら30分くらい工数かかってしまったので、どこかの誰かの為に残しておきます。

「pandas ファンチャート」でググってもHitしませんでしたので・・(Excelは多かったけど)

参考:ファンチャートとは?

1. サンプルデータ作成

サンプルとして適当なデータを作成します
※この程度なら実際はごり押しでもできますが、カラム数がうん千だときついですよね。。

import pandas as pd
df = pd.DataFrame({ 'A' : [1, 2, 3, 4, 5],
                    'B' : [10, 20, 30, 40, 50],
                    'C' : [500, 400, 300, 200, 100]
                  })

display(df.head())
display(df.plot())
wordcloud

2. ファンチャート作成

今回は0行目を「100」としてPandasのMAP関数を使用して処理していく。

数式は簡単で 変換後の値 = (*行目の要素 × 100) ÷ 0行目の要素 となるわけだが、個人的に詰まったのはMAP関数でどうやって0行目の要素っていうのを処理すればいいか?に関してです。

結論から言うと**functools.partial() を使用すれば部分的に変数を固定にできます。**

from functools import partial

def fanchart(x, y):
    """計算関数"""
    return (x*100)/y

"""
・各カラムにMAP関数+partial関数を適応(for使わなくてもできるかもですが。。)
・y=df[i][0]で関数内の引数yを0行目の要素で固定している
"""
for i in df.columns:
    df[i + '_fan'] = list(map(partial(fanchart, y=df[i][0]), df[i]))

display(df.head())
display(df.plot(y=['A_fan', 'B_fan', 'C_fan']))

3.さいごに

Pandasも業務やプライベートで結構使ってるので、ようやく慣れてきたかなぁ・・・と思ってたけど全然そんなことなかったですね。
いつも小難しい記事ばかり書いてたので、たまにはと思って小ネタを今回は書かせていただきました。
おっ、ちょうど困ってて参考になった!という人は私の30分との等価交換(笑)でぜひLGTMお願いします!

4.追記

コメントにご指摘いただきましたが、これわざわざMAP関数使わなくても以下で簡単に実現できましたね。。
まだまだ精進します。。

df*100/df.loc[0]
1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?