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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

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

Python

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

pandas

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

Q&A

解決済

2回答

730閲覧

Pandasを用いて、日付をもとにした集計を行いたい

ren990902

総合スコア2

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

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

Python

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

pandas

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

0グッド

0クリップ

投稿2021/10/19 07:08

Pandasを用いて、日付をもとにした集計を行いたいです。

例えば、以下のような表があったとします。

csv

1 date value 20: 20211010 "A", "B", "C" 31: 20211011 "A", "C" 42: 20211012 "D", "E", "F"

出力したい形式としては、

csv

1 date "A" "B" "C" "D" "E" "F" 20: 20211010 1 1 1 0 0 0 31: 20211011 1 0 1 0 0 0 42: 20211012 0 0 0 1 1 1

ポイントとしては、各列の値の出現頻度、列は文字の種類数の分の行列を作りたいです。

特に、文字の種類数の分の列を作るのに苦戦しており、良いアイデアがあれば教えていただきたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ポイントとなる部分にはpandas.get_dummiesが使えます。

Python

1import pandas as pd 2 3df = pd.DataFrame({'date':[10,11,12], 'value':[list('ABC'),list('AC'),list('DEF')]}) 4print(df) 5# date value 6#0 10 [A, B, C] 7#1 11 [A, C] 8#2 12 [D, E, F] 9 10# valueをばらしてOneHot化して再グループ化 11df = df.explode('value').reset_index(drop=True) 12df = pd.get_dummies(df, columns=['value'], prefix='', prefix_sep='') 13df = df.groupby(['date'], as_index=False).sum() 14print(df) 15# date A B C D E F 16#0 10 1 1 1 0 0 0 17#1 11 1 0 1 0 0 0 18#2 12 0 0 0 1 1 1

投稿2021/10/19 08:59

can110

総合スコア38341

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

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

ren990902

2021/10/19 12:19

ありがとうございます。試してみます。
guest

0

元のDataFrameの形がきれいではないので、前処理をしてdf2の形に整形します。
print(df)

python

1>>> print(df) 2 date value 30 20211010 "A", "B", "C" 41 20211011 "A", "C" 52 20211012 "D", "E", "F" 6>>> 7>>> slist = [] 8>>> for i, row in df.iterrows(): 9... for v in row['value'].split(', '): 10... s = row.copy() 11... s['value'] = v 12... slist.append(s) 13... 14>>> df2 = pd.concat(slist, axis=1).T.reset_index(drop=True) 15>>> print(df2) 16 date value 170 20211010 "A" 181 20211010 "B" 192 20211010 "C" 203 20211011 "A" 214 20211011 "C" 225 20211012 "D" 236 20211012 "E" 247 20211012 "F"

df2に対してget_dummiesを使って0か1の列にします。

python

1>>> df3 = pd.get_dummies(df2, columns=['value'],prefix='', prefix_sep='') 2>>> print(df3) 3 date "A" "B" "C" "D" "E" "F" 40 20211010 1 0 0 0 0 0 51 20211010 0 1 0 0 0 0 62 20211010 0 0 1 0 0 0 73 20211011 1 0 0 0 0 0 84 20211011 0 0 1 0 0 0 95 20211012 0 0 0 1 0 0 106 20211012 0 0 0 0 1 0 117 20211012 0 0 0 0 0 1

df3に対してgroupbyを使って日付付けごとの合計を取ります。

python

1>>> df4 = df3.groupby('date').sum().reset_index() 2>>> print(df4) 3 date "A" "B" "C" "D" "E" "F" 40 20211010 1 1 1 0 0 0 51 20211011 1 0 1 0 0 0 62 20211012 0 0 0 1 1 1

詳しいことが知りたければ、以下をお読みください。

pandas.DataFrame, Seriesを連結するconcat
pandas.DataFrame, Seriesのインデックスを振り直すreset_index
pandasでカテゴリ変数をダミー変数に変換(get_dummies)
pandas.DataFrameをGroupByでグルーピングし統計量を算出

投稿2021/10/19 08:42

ppaul

総合スコア24670

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

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

ren990902

2021/10/19 12:19

ありがとうございます。試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問