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

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

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

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

pandas

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

Q&A

解決済

3回答

1075閲覧

dfの1列にカンマ区切りで入ってる値をカウントして列として追加する方法

_publicnkm

総合スコア2

Python

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

pandas

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

0グッド

0クリップ

投稿2021/10/31 06:57

##やりたいこと
イメージ説明
A列のようなデータの入り方をしている列があり、ここにはカンマ区切りでいくつかのデータが入っています。
このA列に含まれることになるデータはリストが存在しており、このリストは増えたり減ったりする可能性があります。
イメージ説明
①リストのデータを転置して、データ一覧の横に並べて列にする
②データ一覧の中身について、B列の列名と一致するものがいくつあるか数えて、B列のその行に数値を格納
(②の処理をB~最後の列まで実行)

##やってみたこと

Python

1df2 = pd.DataFrame(columns=item_list) 2df3 = pd.concat([df1,df2]) 3for i in range(len(df)): 4 for c in (df3[item_list]): 5 arr = df1.loc[i,'データ一覧'] 6 n = arr.count(c) 7 df3.loc[i,c] = n

困っていること

「あお1」と「あお」など部分一致してしまう値が存在しているからなのか、データ一覧に「あお1」がある場合、「あお」と「あお1」の両方に1とカウントされて入ってしまっているデータがあります。
完全一致の値のみを取り出してカウントするにはどのようにしたらよいでしょうか?

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

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

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

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

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

guest

回答3

0

ベストアンサー

python

1import pandas as pd 2import re 3 4item_list = [ 5 'あお', 'あか', 'きいろ', 'もも', 'あお2', 'もも1' 6] 7 8df = pd.DataFrame({ 9 'データ一覧': [ 10 'あお', 'あか,きいろ', 'あお,もも1', 'きいろ,あお2', 11 'もも1,あか,あお2', 'きいろ,きいろ,あお2', 12 ], 13}) 14 15df[item_list] = [ 16 [ 17 re.subn(fr'(^|(?<=,))\s*{p}\s*(?=(,|$))', '', df.loc[r, 'データ一覧'])[1] 18 for p in item_list 19 ] 20 for r in range(len(df)) 21] 22 23pd.set_option('display.unicode.east_asian_width', True) 24print(df) 25 26# 27 データ一覧 あお あか きいろ もも あお2 もも1 280 あお 1 0 0 0 0 0 291 あか,きいろ 0 1 1 0 0 0 302 あお,もも1 1 0 0 0 0 1 313 きいろ,あお2 0 0 1 0 1 0 324 もも1,あか,あお2 0 1 0 0 1 1 335 きいろ,きいろ,あお2 0 0 2 0 1 0

投稿2021/10/31 08:24

編集2021/10/31 09:32
melian

総合スコア19849

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

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

_publicnkm

2021/10/31 09:35

回答有り難うございます! 例に挙げた値以外を増やしたときに想定通りに動きませんでした。 import pandas as pd import re item_list = [ 'あお2', 'あか', 'きいろ', 'もも', 'あお', 'もも1','小学1','新小学1' ] df = pd.DataFrame({ 'データ一覧': [ 'あお', 'あか,きいろ', 'あお,もも1', 'きいろ,あお2', 'もも1,あか,あお2', 'きいろ,きいろ,あお2','新小学1,もも' ], }) df[item_list] = [ [ re.subn(fr'{p}(,|$)', '', df.loc[r, 'データ一覧'])[1] for p in item_list ] for r in range(len(df)) ] pd.set_option('display.unicode.east_asian_width', True) print(df) データ一覧 あお2 あか きいろ もも あお もも1 小学1 新小学1 0 あお 0 0 0 0 1 0 0 0 1 あか,きいろ 0 1 1 0 0 0 0 0 2 あお,もも1 0 0 0 0 1 1 0 0 3 きいろ,あお2 1 0 1 0 0 0 0 0 4 もも1,あか,あお2 1 1 0 0 0 1 0 0 5 きいろ,きいろ,あお2 1 0 2 0 0 0 0 0 6 新小学1,もも    0 0 0 1 0 0 1 1 リストに「新小学1」「小学1」が存在し、データに「新小学1」があるとき、小学1の列は0、新小学1の列は1にしたいのですが、どちらにも1が入ってしまいます。 なぜ「あお」と「あお2」は区別出来るのに、これらの文字列だと区別できなくなってしまうのでしょうか?
melian

2021/10/31 09:41

変更した回答で試していただけますか?
_publicnkm

2021/10/31 10:06

ありがとうございます!変更後のコードを使わせていただいて、想定通りの結果が得られました!!ほんとうにありがとうございます!
guest

0

行や列の順番が変わって良いなら以下です。

python

1>>> print(df) 2 データ一覧 30 あお 41 あか,きいろ 52 あお,もも1 63 きいろ,あお2 74 もも1,あか,あお2 85 きいろ,きいろ,あお2 9>>> df['データ'] = df['データ一覧'].apply(lambda s: s.split(',')) 10>>> pd.get_dummies(df.explode('データ'), columns=['データ'], prefix='', prefix_sep='').groupby('データ一覧').sum().reset_index() 11 データ一覧 あお あお2 あか きいろ もも1 120 あお 1 0 0 0 0 131 あお,もも1 1 0 0 0 1 142 あか,きいろ 0 0 1 1 0 153 きいろ,あお2 0 1 0 1 0 164 きいろ,きいろ,あお2 0 1 0 2 0 175 もも1,あか,あお2 0 1 1 0 1

投稿2021/10/31 07:33

ppaul

総合スコア24666

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

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

_publicnkm

2021/10/31 08:56

回答有り難うございます。 最後のgroupbyの処理をしたところ、最初に持っていた行数より若干減ってしまいました。 あまり必要なさそうだと思ったので記載していなかったのですが、最初に質問に記載した内容にプラスで「ユーザID」と「時間」の列を持っています(ユーザIDはNullの行もいくつかありますが、「時間」についてはNot Nullです)、groupbyの対象の列にそれらも加えたのですが、行数が減ってしまいました。やりたい処理にかなり近いものの、なんらかの要因で集計されてしまってデータが減ってしまうと意味がないので、列名と完全一致するものがいくつあるのか?を1行ずつ1列ずつ確実に処理できないものでしょうか?
guest

0

とりあえず以下のようなコードで最初のデータのみで欲しい結果は得られます。
もし次に提示されたリストに含まれる列のみ欲しければ、その列だけ抽出すればよいです。
参考:Pandas convert a column of list to dummies

Python

1data = [['Blue'],['Red','Yellow'],['Blue','Pink1'],['Yellow','Blue2'],['Pink1','Red','Blue2'],['Yellow','Yellow','Blue2']] 2df2 = pd.DataFrame({'data_list':data}) 3df3 = pd.get_dummies(df2['data_list'].apply(pd.Series).stack()).sum(level=0) 4df = pd.concat([df2,df3], axis=1) 5print(df) 6""" 7 data_list Blue Blue2 Pink1 Red Yellow 80 [Blue] 1 0 0 0 0 91 [Red, Yellow] 0 0 0 1 1 102 [Blue, Pink1] 1 0 1 0 0 113 [Yellow, Blue2] 0 1 0 0 1 124 [Pink1, Red, Blue2] 0 1 1 1 0 135 [Yellow, Yellow, Blue2] 0 1 0 0 2 14"""

投稿2021/10/31 07:29

can110

総合スコア38268

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問