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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

856閲覧

dataframeから特定の条件の箇所をブロックとして抜き出す

Seniorious

総合スコア2

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/11/11 05:54

##解決したいこと
下記コードを実行するとdataframeの各行に0,1のクラスが与えられます。(図1参照)
得られたクラス分けをもとに0あるいは1が連続している箇所を一つのブロックとして抜き出し、ブロック内の各値の平均を算出、これをdataframe全体に行い結果をdataframeに保存したいです。結果を保存する際はクラスごとのdataframeを作成せず、同一のものに保存し、図1のように属するクラスを確認できるようにしたいです。

python

1def calc_minus(n): 2 return n * -1 3 4place = '/hogehoge.xlsx' 5wb = openpyxl.load_workbook(place) 6ws = wb["Sheet1"] 7 8#Vzを取得 9Vz = [] 10for row in ws.iter_rows(min_row=1,min_col=1,max_col=1): 11 if all(is_empty(c) for c in row): 12 break 13 for col in row: 14 Vz.append(col.value) 15 16#Vxを取得 17Vx = [] 18for row in ws.iter_rows(min_row=1,min_col=2,max_col=2): 19 if all(is_empty(c) for c in row): 20 break 21 for col in row: 22 Vx.append(col.value) 23Vx_alt =list(map(calc_minus,Vx)) 24 25#Vyを取得 26Vy = [] 27for row in ws.iter_rows(min_row=1,min_col=3,max_col=3): 28 if all(is_empty(c) for c in row): 29 break 30 for col in row: 31 Vy.append(col.value) 32 33#gmmで分類 34gmm = GaussianMixture(n_components=2,covariance_type='full' 35 ).fit(np.array(Vx_alt).reshape(-1,1)) 36 37#dataframeを作成 38results = gmm.predict(np.array(Vx_alt).reshape(-1,1)) 39results_list = results.tolist() 40 41results_array = pd.DataFrame(np.array(Vx_alt).reshape(-1,1),columns=['Vx']) 42results_array['Vy']=Vy 43results_array['Vz']=Vz 44results_array['class']=results

イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

0あるいは1が連続している箇所を一つのブロックとして…

結果が判りづらいので、ブロックの開始・終了の位置(元のデータフレームのインデックス)を追加しています。

python

1import pandas as pd 2from numpy.random import default_rng 3 4N = 100 5rg = default_rng() 6 7df = pd.DataFrame({ 8 'Vx': rg.uniform( 0.0, 4.0, N), 9 'Vy': rg.uniform(-1.0, 1.0, N), 10 'Vz': rg.uniform( 5.0, 7.0, N), 11 'class': rg.integers(0, 2, N), 12}) 13 14dfx = ( 15 df.groupby(df['class'].ne(df['class'].shift()).cumsum()) 16 .apply(lambda x: 17 x.mean().append( 18 pd.Series([x.index.min(), x.index.max()], 19 index=['begin', 'end'])) 20 if len(x) > 1 else None) 21 .dropna().reset_index(drop=True) 22 .astype({'class': int, 'begin': int, 'end': int}) 23) 24 25# 26# 27 df dfx 28 Vx Vy Vz class Vx Vy Vz class begin end 290 3.773857 -0.912339 5.791987 1 1.801505 -0.075173 6.260591 0 1 3 301 1.883060 0.127226 6.809828 0 0.864858 0.101190 5.868909 0 7 8 312 2.584235 -0.464148 6.726102 0 2.832653 -0.345053 6.173351 1 9 10 323 0.937219 0.111404 5.245844 0 1.869920 0.037095 6.206466 1 20 21 334 1.722865 0.078432 6.860804 1 2.578025 0.324663 5.605735 0 22 23 345 3.701636 0.237778 6.614372 0 : 356 0.464745 0.635066 6.215357 1 : 367 0.860069 -0.285645 6.029577 0 378 0.869647 0.488025 5.708240 0 389 2.745221 0.020144 6.577324 1 3910 2.920085 -0.710250 5.769379 1 4011 0.278420 -0.970768 6.845683 0 4112 2.100717 -0.375994 5.481765 1 4213 3.611791 -0.584952 6.363336 0 4314 3.531184 0.318425 5.675838 1 4415 3.500748 -0.135428 6.149983 0 4516 2.789142 -0.194341 5.863369 1 4617 1.503722 0.411294 5.593864 0 4718 2.323442 0.891810 5.315335 1 4819 0.447059 0.391535 5.280805 0 4920 0.286016 -0.331588 5.947702 1 5021 3.453824 0.405779 6.465230 1 5122 1.530574 0.543354 5.633924 0 5223 3.625477 0.105973 5.577545 0 5324 2.455725 -0.531541 6.533032 1 54 : 55

投稿2021/11/11 14:07

melian

総合スコア19803

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

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

Seniorious

2021/11/16 03:01

ご回答ありがとうございます。またブロックの開始,終了位置も示していただき助かります.
guest

0

やりたいことが正確には分からないので推定してコーディングしました。

python

1df['block'] = (df['class'].shift() != df['class']).cumsum() - 1 2df2 = df.groupby('block').mean() 3df2['class'] = df2['class'].astype(int) 4print(df2)

実行結果は以下です。

python

1>>> print(df) 2 Vx Vy Vz class 30 0.713714 5.077248 -5.710741 0 41 -2.384603 2.749758 -1.496205 0 52 0.691213 -4.300654 5.991640 1 63 -1.152535 0.047083 2.225310 1 74 3.787389 4.381099 -6.763796 1 85 -5.781316 -2.719944 -3.549003 1 96 3.525693 3.859094 -4.556069 0 107 -1.890213 0.714044 -3.304741 1 118 0.642162 -5.764175 -3.035738 1 129 3.264630 -5.960897 1.483059 0 1310 1.118401 -3.250766 -5.959740 0 1411 -0.097570 -4.738675 -2.763576 1 1512 0.493329 -1.711824 -3.488968 0 1613 -5.031331 -2.279175 -3.896500 0 1714 -3.066312 0.224330 -6.943145 0 1815 -1.927776 -2.476299 4.638220 1 1916 -4.411190 -2.012366 -6.217488 0 2017 -2.909596 1.803804 -2.310100 1 2118 1.260642 -0.809250 -5.833690 1 2219 -5.576907 1.643118 4.439394 0 23>>> df['block'] = (df['class'].shift() != df['class']).cumsum() - 1 24>>> df2 = df.groupby('block').mean() 25>>> df2['class'] = df2['class'].astype(int) 26>>> print(df2) 27 Vx Vy Vz class 28block 290 -0.835445 3.913503 -3.603473 0 301 -0.613812 -0.648104 -0.523962 1 312 3.525693 3.859094 -4.556069 0 323 -0.624026 -2.525065 -3.170239 1 334 2.191516 -4.605831 -2.238340 0 345 -0.097570 -4.738675 -2.763576 1 356 -2.534771 -1.255557 -4.776204 0 367 -1.927776 -2.476299 4.638220 1 378 -4.411190 -2.012366 -6.217488 0 389 -0.824477 0.497277 -4.071895 1 3910 -5.576907 1.643118 4.439394 0

求めるものと違っているなら、質問に追加してください。

投稿2021/11/11 06:59

ppaul

総合スコア24666

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

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

Seniorious

2021/11/16 03:04

ご回答いただきありがとうございます。melian様のものがより求めているもの近かったため,melian様をベストアンサーとさせていただきました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問