はじめに
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ないに変更を加えるコードを足してあげれば、逐次的に変更が可能で、意外とこっちのほうが便利かと思います