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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

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回答

1244閲覧

【Pandas】条件一致する行で区切ってグルーピングしたい

niwatorinancha

総合スコア3

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

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/03/17 05:57

前提・実現したいこと

python,pandasで条件に合う行までを一つのグループとして、新たな列['count']に数字を振りたい

発生している問題

A B 0 a 10 1 b 20 2 c 30 3 d 40 4 a 50 5 e 60 6 a 10 7 g 20 8 h 30 9 y 40 10 a 50

このようなデータが存在する際に

A B count 0 a 10 0 1 b 20 0 2 c 30 0 3 d 40 0 4 a 50 1 5 e 60 1 6 a 10 2 7 g 20 2 8 h 30 2 9 y 40 2 10 a 50 3

['A'] == aとなる行からを一つのグループとして、['count']列に数字を振りたいです

試したこと

.cumsum()を利用してcountの数字を増やしていこうと思ったのですが、aを区切りにグルーピングする方法がわかりません

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

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

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

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

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

bsdfan

2021/03/17 06:31

解決済みなので、こちらに。 cumsumを使う方法です。 df['count'] = (df['A'] == 'a').cumsum() - 1
ppaul

2021/03/17 08:38

df['A'][0]が'a'でない場合もあるなら、1引かない方が良いかもしれないですね。
guest

回答2

0

遅ればせながら、cumsumで1行で計算する例。

A列の値が'a'の行だけTrue、それ以外はFalseとなるシリーズを生成し、それに対してcumsumを使うと、1,1,1,1,2,2,3,3,3,3,4 というシリーズが得られ、それを-1すれば目的の値になる。

Python

1import pandas as pd 2import io 3 4txt = """ 5A,B 6a,10 7b,20 8c,30 9d,40 10a,50 11e,60 12a,10 13g,20 14h,30 15y,40 16a,50 17""" 18 19df = pd.read_csv(io.StringIO(txt)) 20 21df['count'] = (df['A'] == 'a').cumsum() - 1 22 23print(df)

result

1 A B count 20 a 10 0 31 b 20 0 42 c 30 0 53 d 40 0 64 a 50 1 75 e 60 1 86 a 10 2 97 g 20 2 108 h 30 2 119 y 40 2 1210 a 50 3

投稿2021/03/17 07:15

編集2021/03/17 07:17
Daregada

総合スコア11990

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

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

Daregada

2021/03/17 07:36

おう、質問への追記に書いてあったわ。
guest

0

ベストアンサー

cumsumはピンとこなかったので、別例として。

python3

1import io 2import pandas as pd 3import numpy as np 4data = """ A B 50 a 10 61 b 20 72 c 30 83 d 40 94 a 50 105 e 60 116 a 10 127 g 20 138 h 30 149 y 40 1510 a 50""" 16df = pd.read_table(io.StringIO(data), delimiter="\s+") 17df["count"] = np.nan 18df["count"][df["A"] == "a"] = [i for i in range(sum(df["A"] == "a"))] 19print(df) 20# A B count 21# 0 a 10 0.0 22# 1 b 20 NaN 23# 2 c 30 NaN 24# 3 d 40 NaN 25# 4 a 50 1.0 26# 5 e 60 NaN 27# 6 a 10 2.0 28# 7 g 20 NaN 29# 8 h 30 NaN 30# 9 y 40 NaN 31# 10 a 50 3.0 32 33df = df.fillna(method='ffill') 34print(df) 35# A B count 36# 0 a 10 0.0 37# 1 b 20 0.0 38# 2 c 30 0.0 39# 3 d 40 0.0 40# 4 a 50 1.0 41# 5 e 60 1.0 42# 6 a 10 2.0 43# 7 g 20 2.0 44# 8 h 30 2.0 45# 9 y 40 2.0 46# 10 a 50 3.0

投稿2021/03/17 06:09

jeanbiego

総合スコア3966

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

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

niwatorinancha

2021/03/17 06:24

助かりました 素早くわかりやすい回答、本当にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問