0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

pandas DataFrameの条件にあてはまる値のindexとcolumnを取得する方法

Posted at

はじめに

Excelだと条件に当てはまるcellに何かしらの変更を加えるのは簡単
なのにpandas dataframeだと直感的な関数がない!
ということで二通りの方法を考えてみました

#サンプルデータ

import numpy as np

 timestep = [[np.random.randint(2) for _ in range(9)] for __ in range(3)]
 index = [f'station{i}' for i in range(3)]
 columns = list(map(str, np.arange(9)))
 df = pd.DataFrame(timestep, index=index, columns=columns)

サンプルデータは0と1のみで構成されたデータフレームです

1. 全探索型

 ls = []
 for i in df.index:
     for j in df.columns:
         if df.at[i,j] == 1:
             ls.append([i,j])

データフレーム内の値が1である部分だけのindexとcolumnを取得しています
全要素について1であるかどうかの判定を行います
Trueであったものをリストに格納します
なにか変更を加えるときはdf.at[ls[0,0],ls[0,1]]みたいな感じで取り出せます

2. ランダム型

import random

ls = []
sample = 3
for _ in range(sample):
    req_columns = df.loc[:, (df == 1).any()].columns.tolist()
    rand_column = random.choice(req_columns)
    req_index = df[df[rand_column] == 1].index.tolist()
    rand_index = random.choice(req_index)
    ls.append([rand_column, rand_index])

random型ははじめに条件を満たすcolumnを抜き出します
そこから今回はランダムな一列を抜き出しています
選ばれた列に対し、再度条件を判定します
条件を満たす行のみが抜き出されるはずです
このなかから、再度ランダムに一行を取り出します
これにより条件を満たすランダムな1cellを抜き出すことに成功したことになります
その値をリストに格納し、sample数だけループを行います

ランダム型は、まどろっこしいですが、各セルごとに確実に変更を加えることに向いています
こんかいはランダムに1列、1行を選びましたが、列ごとに操作したり、行ごとに操作したりがしやすいです
for loopないに変更を加えるコードを足してあげれば、逐次的に変更が可能で、意外とこっちのほうが便利かと思います

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?