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

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

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

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

pandas

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

Q&A

解決済

1回答

477閲覧

pandasに入った配列内の文字列カウント方法に関して

gyungyun545

総合スコア84

Python 3.x

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

pandas

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

0グッド

1クリップ

投稿2019/04/22 02:25

pandasの中に配列を入れたのですが、その配列内の文字列を対象に操作をしたいです。

ループ文を使えば簡単に実現できるとは思いますが、pandasに格納した意味が薄れてしまうので、pandasの関数を組み合わせて、キレイに実行する方法を探しております。
もしご存知でしたら教えていただきたいです。

行いたい操作をデータ例を交えて下記に説明します。

#データ例
データは下記のようなデータです。
(Z列は、チェックボックスからのデータを格納したものであり、同じ文字列が同じ配列内に2つ登場することはありません。)

python3

1>>> df.keys() 2Index(['X', 'Y', 'Z'], 3 dtype='object') 4>>> df 5 X Y Z 60 5 0 [A, B] 71 10 1 [C] 83 30 1 [A] 94 25 2 [A, B, C] 105 15 0 [] 11[5 rows x 3 columns]

#実行したい操作
① 列Zの配列の文字数の出現数カウント(出現行数カウント)

python3

1A 3 2B 2 3C 2

② 列Zの配列内の文字列Aでフィルターしたdf_A
pandas型にできれば更にあとは自分で細かい操作ができるのでありがたいです。

python3

1>>> df_A 2 X Y Z 30 5 0 [A, B] 41 30 1 [A] 52 25 2 [A, B, C] 6[3 rows x 3 columns]

③ 列Zの配列の文字列ごとのグループ集計

python3

1A 60 3 2B 30 2 3C 35 3

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

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

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

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

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

guest

回答1

0

ベストアンサー

df.Z.apply(pd.Series)
することで Z列のリストをDataFrameに展開、
さらにはdf.Z.apply(pd.Series).stack()
することで1次元化することができるかと思いますので、前処理としてこの Seriesデータと元のデータフレームを結合しておくことで、(1)~(3)の処理を簡単に実現できるかと思います。

Python

1import pandas as pd 2import json 3import io 4 5data = """ 6X Y Z 75 0 ["A","B"] 810 1 ["C"] 930 1 ["A"] 1025 2 ["A","B","C"] 1115 0 [] 12""" 13df = pd.read_csv(io.StringIO(data), sep='\t', converters={'Z':json.loads}) 14# X Y Z 15#0 5 0 [A, B] 16#1 10 1 [C] 17#2 30 1 [A] 18#3 25 2 [A, B, C] 19#4 15 0 [] 20 21 22tmp = df.Z.apply(pd.Series).stack().reset_index(level=1, drop=True).rename('Z') 23df = df.loc[:,['X','Y']].join(tmp).reset_index(drop=True) 24print(df) 25# X Y Z 26#0 5 0 A 27#1 5 0 B 28#2 10 1 C 29#3 30 1 A 30#4 25 2 A 31#5 25 2 B 32#6 25 2 C 33#7 15 0 NaN 34 35 36# (1) 列Zの配列の文字数の出現数カウント(出現行数カウント) 37print(df['Z'].value_counts()) 38#A 3 39#C 2 40#B 2 41#dtype: int64 42 43# (2) 列Zの配列内の文字列Aでフィルター 44print(df[df.Z == 'A']) 45# X Y Z 46#0 5 0 A 47#3 30 1 A 48#4 25 2 A 49 50# (3) 列Zの配列の文字列ごとのグループ集計 51print(df.groupby('Z').sum()) 52# X Y 53#Z 54#A 60 3 55#B 30 2 56#C 35 3

投稿2019/04/22 05:15

magichan

総合スコア15898

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

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

gyungyun545

2019/04/23 01:20

ご教授いただきありがとうございます。 大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問