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

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

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

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

pandas

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

Q&A

解決済

2回答

1205閲覧

特定の値がデータフレーム内の各カラム内にいくつ存在しているか数える方法。

amaturePy

総合スコア131

Python

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

pandas

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

0グッド

0クリップ

投稿2021/06/04 07:37

編集2021/06/04 09:37

データフレームの各カラム列内に指定の値と同一の値がいくつあるかカウントするメソッドなどがないか探しています。もしするとcountifが使えるのかと調べています。安直に.countメソッドの引数にカウントしたい値()を特定で切るかと思い、調べたのですが、できないようでした。
やりたいこととしては日付データの入っているlistAの各要素(日付)をdfB内の各列がいくつ持っているのかを集計するというものです。その列ごとのカウント数は別のデータフレームとして縦方向に一列に格納できれば理想です。
その列内の値ごとの総数を集計することはできるようなのですが、 そもそもこちらから値を指定して、カウントできるか手探りな状態なので、できないかもしれませんが、ご教授頂ければ幸いです。

ざっくりとできるか確認したコードは以下のような感じです。dfオブジェクトに対し、listA内の日付の要素をcountする際に指定して、各列にその指定値がどれくらいあるか調べます。

for x in listA: ~~~~~count(x)
理想の出力としては以下のものです。 dfB側の全てのcolumnに対してリストA内の日付がいくつあるかそれぞれ取得してます。 最終的にはこのカウント部分だけ切り離して別のdfとして扱う予定です。 push1_start_date 2021-05-10    0 2021-05-11 2 2021-05-12 3 2021-05-13 3 2021-05-14 4 ------続く push2_start_date 2021-05-10    1 2021-05-11 2 2021-05-12 5 2021-05-13 8 2021-05-14 15 ------続く push3_start_date 2021-05-10    0 2021-05-11 0 2021-05-12 0 2021-05-13 0 2021-05-14 5 ------続く
listA ['2021-04-29', '2021-04-30', '2021-05-01', '2021-05-02', '2021-05-03', '2021-05-04', '2021-05-05', '2021-05-06', '2021-05-07', '2021-05-08', '2021-05-11', '2021-05-12', '2021-05-13', '2021-05-14', '2021-05-15', '2021-05-16', '2021-05-17', '2021-05-18', '2021-05-19', '2021-05-20', '2021-05-21', '2021-05-22', '2021-05-23', '2021-05-24', '2021-05-25', '2021-05-26', '2021-05-27', '2021-05-28', '2021-05-29', '2021-05-30', '2021-05-31', '2021-06-01', '2021-06-02', '2021-06-03', '2021-06-04', '2021-05-12', '2021-05-13', '2021-05-14', '2021-05-15', '2021-05-16', '2021-05-17', '2021-05-18', '2021-05-19', '2021-05-20', '2021-05-21', '2021-05-22', '2021-05-23', '2021-05-24',続く]
dfB push1_start_date push2_start_date push3_start_date push4_start_date push5_start_date push6_start_date push7_start_date push8_start_date 0 2021-05-31 2021-06-01 <NA> <NA> <NA> <NA> <NA> <NA> 1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 2 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 4 2021-05-11 2021-05-12 <NA> <NA> <NA> <NA> <NA> <NA> 5 2021-05-08 <NA> <NA> <NA> <NA> <NA> <NA> <NA>

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

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

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

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

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

ppaul

2021/06/04 08:25

欲しいものが良くわかりません。 各xに対して、回数を求めたいのですか、それともdfBの各列に対してどれかのxが入っている回数を求めたいのですか。
amaturePy

2021/06/04 08:39

わかりにくい記述で失礼しました。質問文に理想の出力を追記させていただきました。またdfAではなく、日付の入っているlistAになります。 やりたいこととしては後者になります。リスト内に存在している全日付をdfB側の全カラム(push1~8_start_date)のそれぞれでどれだけ保持しているか集計したいです。
guest

回答2

0

これでできていませんでしょうか。

python

1df_result = dfB.apply(lambda s: s.value_counts().reindex(listA, fill_value=0))

applyで各カラムごとに、
・value_countsで値とその個数を求めて、
・reindexでlistAのものだけを取り出して(fill_value=0でvalue_countsでなかったところはゼロ埋め)
います

投稿2021/06/04 12:07

編集2021/06/04 12:08
bsdfan

総合スコア4794

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

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

amaturePy

2021/06/04 15:08

ありがとうございます!はい。問題なさそうです。解説までありがとうございます。 こちらのコードも参考に学習させていただきます。lamdaもこのように使用するのですね。
guest

0

ベストアンサー

縦1列だと使いにくそうなので、縦横のデータフレームにしてみました。

出力例

python

1>>> print(df_counts) 2 push1_start_date push2_start_date push3_start_date push4_start_date push5_start_date 3dates 42021-04-29 0 0 0 0 0 52021-04-30 1 0 0 0 0 62021-05-01 1 0 0 0 1 72021-05-02 0 0 0 0 0 82021-05-03 1 0 0 2 0 92021-05-04 0 0 0 0 0 102021-05-05 1 0 0 0 1 112021-05-06 2 0 1 0 0 122021-05-07 0 0 0 0 0 132021-05-08 0 1 0 0 0 142021-05-11 0 3 1 1 1 152021-05-12 1 1 1 0 2 162021-05-13 0 0 1 0 0 172021-05-14 1 0 0 1 2 182021-05-15 3 1 1 3 0 192021-05-16 0 2 0 0 0 202021-05-17 0 1 0 2 0 212021-05-18 1 0 2 2 3 222021-05-19 0 1 0 0 0 232021-05-20 2 2 0 0 2 242021-05-21 0 0 0 0 0 252021-05-22 0 2 2 2 0 262021-05-23 0 0 1 2 1 272021-05-24 0 0 1 0 1 282021-05-25 0 0 0 1 1 292021-05-26 1 0 0 0 1 302021-05-27 1 0 1 0 0 312021-05-28 1 0 0 0 0 322021-05-29 0 1 0 0 0 332021-05-30 1 0 1 0 0 342021-05-31 0 2 0 0 0 352021-06-01 0 1 1 1 1 362021-06-02 1 1 0 2 0 372021-06-03 0 0 1 1 1 382021-06-04 0 2 0 0 1 392021-05-12 1 1 1 0 2 402021-05-13 0 0 1 0 0 412021-05-14 1 0 0 1 2 422021-05-15 3 1 1 3 0 432021-05-16 0 2 0 0 0 442021-05-17 0 1 0 2 0 452021-05-18 1 0 2 2 3 462021-05-19 0 1 0 0 0 472021-05-20 2 2 0 0 2 482021-05-21 0 0 0 0 0 492021-05-22 0 2 2 2 0 502021-05-23 0 0 1 2 1 512021-05-24 0 0 1 0 1

元データ

python

1>>> print(dates) 2>>> print(dates) 3['2021-04-29', '2021-04-30', '2021-05-01', '2021-05-02', '2021-05-03', '2021-05-04', '2021-05-05', '2021-05-06', '2021-05-07', '2021-05-08', '2021-05-11', '2021-05-12', '2021-05-13', '2021-05-14', '2021-05-15', '2021-05-16', '2021-05-17', '2021-05-18', '2021-05-19', '2021-05-20', '2021-05-21', '2021-05-22', '2021-05-23', '2021-05-24', '2021-05-25', '2021-05-26', '2021-05-27', '2021-05-28', '2021-05-29', '2021-05-30', '2021-05-31', '2021-06-01', '2021-06-02', '2021-06-03', '2021-06-04', '2021-05-12', '2021-05-13', '2021-05-14', '2021-05-15', '2021-05-16', '2021-05-17', '2021-05-18', '2021-05-19', '2021-05-20', '2021-05-21', '2021-05-22', '2021-05-23', '2021-05-24'] 4>>> print(df) 5 push1_start_date push2_start_date push3_start_date push4_start_date push5_start_date 60 <NA> 2021-06-02 2021-05-06 <NA> 2021-05-20 71 2021-05-26 <NA> <NA> 2021-05-14 <NA> 82 <NA> 2021-05-16 <NA> 2021-05-15 2021-05-01 93 <NA> <NA> 2021-06-03 2021-05-03 <NA> 104 2021-05-18 2021-05-11 2021-05-12 2021-05-11 2021-05-23 115 <NA> 2021-05-22 <NA> 2021-05-17 2021-05-18 126 2021-05-06 <NA> 2021-05-15 <NA> <NA> 137 <NA> <NA> <NA> <NA> 2021-05-11 148 2021-05-30 2021-06-04 2021-05-18 2021-06-02 2021-05-18 159 2021-05-01 2021-05-16 <NA> 2021-05-25 2021-05-14 1610 2021-05-12 <NA> <NA> <NA> 2021-05-24 1711 2021-05-06 2021-05-17 2021-05-24 2021-05-23 2021-05-18 1812 <NA> <NA> 2021-06-01 2021-05-18 2021-06-03 1913 <NA> 2021-05-11 <NA> 2021-06-02 2021-05-14 2014 2021-05-28 2021-06-01 2021-05-11 <NA> 2021-06-01 2115 <NA> 2021-05-11 <NA> 2021-05-17 <NA> 2216 2021-05-15 2021-05-15 <NA> <NA> 2021-06-04 2317 2021-05-14 2021-05-31 2021-05-30 <NA> <NA> 2418 2021-04-30 2021-05-08 <NA> 2021-05-03 2021-05-26 2519 2021-05-20 <NA> 2021-05-23 2021-05-15 <NA> 2620 <NA> 2021-05-29 2021-05-27 2021-05-15 2021-05-05 2721 <NA> 2021-05-22 <NA> <NA> 2021-05-12 2822 2021-05-20 2021-05-20 <NA> 2021-06-01 2021-05-25 2923 <NA> 2021-05-31 <NA> 2021-05-18 <NA> 3024 2021-05-05 2021-06-04 2021-05-22 2021-05-22 <NA> 3125 2021-05-03 2021-05-20 2021-05-18 <NA> <NA> 3226 2021-06-02 2021-05-12 <NA> 2021-05-22 2021-05-20 3327 2021-05-27 <NA> 2021-05-13 2021-06-03 <NA> 3428 2021-05-15 2021-05-19 <NA> <NA> <NA> 3529 2021-05-15 <NA> 2021-05-22 2021-05-23 2021-05-12

処理

python

1df_dates = pd.DataFrame({'dates': dates}) 2 3def count_one_column(df, column, df_dates): 4 df1 = df[[column]].copy() 5 df1['count'] = 1 6 df2 = df1.groupby(column).sum().reset_index() 7 df3 = pd.merge(df_dates, df2, 8 left_on='dates', right_on=column, how='left') 9 df4 = df3.drop(column, axis=1).set_index('dates') 10 df4.columns = [column] 11 df4.fillna(0.0, inplace=True) 12 df5 = df4[column].astype(int) 13 return df5 14 15df_counts = pd.concat([count_one_column(df, column, df_dates) for column in df.columns], axis=1) 16print(df_counts)

投稿2021/06/04 10:48

編集2021/06/04 10:52
ppaul

総合スコア24670

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

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

amaturePy

2021/06/04 15:10

ありがとうございます! 実装できました。頂いたコードを分解して再度pandasの学習してみます。 pandasでは簡単処理しか行なってこなかったので、若干理解していくのに時間がかかりそうですが、、、 とても参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問