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

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

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

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

pandas

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

Q&A

解決済

1回答

188閲覧

条件を満たす箇所だけ欠損を補いたい

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2018/12/11 20:00

編集2018/12/13 04:35

前提・実現したいこと

現在,ある条件の元,列毎に欠損を埋めるプログラムを作成しています.計算結果がnanになった場合,欠損は埋めずに次のループに行きたいのですが,その方法が分かりません.不躾で申し訳ございませんが,ご教授お願いいたします.

実現したいことは,df1のd列以降の欠損を以下の条件の元,埋めた新しいデータフレームdfを作成したいです
df1のa列はレイヤーの番号,b,c列は地点番号(b,cを結ぶと直線が表現できる),d列は角度,e列以降はbc間の情報が入っています.
df1
index|a|b|c|d|e|f
|:--|:--:|--:|:--|:--:|--:|
1|45|1|2|0|2|2|
2|45|2|3|0|nan|nan|
3|45|3|4|10|5|5|
4|45|3|6|358|3|3|
5|45|4|5|0|2|2|
6|45|5|6|0|3|nan|
7|45|7|8|0|5|5|
8|35|2|3|10|nan|2|
9|35|3|4|10|nan|nan|
10|35|4|5|10|5|5|
11|35|5|7|20|2|2|
12|35|6|7|20|nan|nan|
13|35|7|8|15|5|5|
14|25|1|2|6|nan|5|

<条件>

  • 埋める対象となるセルの条件(例:index=2のe列が対象か調べる場合)
  1. 欠損しているセルの行のa列要素と同じ値を持つ行がdfにある

(index=1~7が該当)
0. 欠損しているセルのb列の要素と同じ要素をc列に持ち,1.を満たす行がdfにあること.
(index=1の行が該当)
0. 欠損しているセルのc列の要素と同じ要素をb列に持ち,1.を満たす行がdfにあること.
(index=3と4の行が該当)
0. 2.3.で該当した行が欠損しているセルの列と同じ列に要素がある
(index=1,3,4のe列には要素があるため,index=2のe列の欠損は埋める対象となる)
以上の条件を満たさないセルは,dfでは欠損のままになる

<埋め方>
条件2,3で該当した行の欠損しているセルの列と同じ列の要素で平均した値を,条件4で決定した欠損しているセルに入れる.
ここで,条件2,3で該当した行が,それぞれの条件で2行以上ある場合は,欠損しているセルの行のd列(角度)を基準にして角度の差が絶対値で小さい方を採用する.
(条件3では2行該当しているため,index=2のd列を基準としてindex=3,4の角度差を見る.index=4の角度差の方が小さいため,index=4を採用し,index=1,4のe列の平均値で欠損を埋める)

df
index|a|b|c|d|e|f
|:--|:--:|--:|:--|:--:|--:|
1|45|1|2|0|2|2|
2|45|2|3|0|2.4|2.4|
3|45|3|4|10|5|5|
4|45|3|6|358|3|3|
5|45|4|5|0|2|2|
6|45|5|6|0|3|nan|
7|45|7|8|0|5|5|
8|35|2|3|10|nan|2|
9|35|3|4|10|nan|2.9|
10|35|4|5|10|5|5|
11|35|5|7|20|2|2|
12|35|6|7|20|nan|nan|
13|35|7|8|15|5|5|
14|25|1|2|6|nan|5|

python

1import pandas as pd 2 3df1=pd.DataFrame([[45,1,2,0,2,2],[45,2,3,0,None,None],[45,3,4,10,5,5],[45,3,6,358,3,3], 4 [45,4,5,0,2,2],[45,5,6,0,3,None],[45,7,8,0,5,5], 5 [35,2,3,10,None,2],[35,3,4,10,None,None],[35,4,5,10,5,5], 6 [35,5,7,20,2,2],[35,6,7,20,None,None],[35,7,8,15,5,5], 7 [25,1,2,6,None,5]],columns=["A","B","C","D","E","F"]) 8 9df=df1.copy() 10 11collist=df.columns.tolist() 12col=len(df.columns) 13info = df.columns.get_loc("E") 14 15A=collist.index("A") 16B=collist.index("B") 17C=collist.index("C") 18kakudo=collist.index("D") 19 20for n in range(info,col):#dfを1列ずつ処理 21 k=df[df[collist[n]].isnull()] 22 k_index=k.index.values 23 24 for i in range(len(k)):#kを1行ずつ処理 25 if df[(df["A"]==k.iloc[i,A])&(df["C"]==k.iloc[i,B])].empty: 26 continue 27 m=df[(df["A"]==k.iloc[i,A])&(df["C"]==k.iloc[i,B])] 28 29 if len(m)==0: 30 mae=pd.DataFrame([None,None,None,None,None,None],columns=collist) 31 elif len(m)==1: 32 mae=m 33 else: 34 mk=[] 35 for x in range(len(m)): 36 mk.append(min(abs(m.iloc[x,kakudo]-k.iloc[i,kakudo]),360-m.iloc[x,kakudo]+k.iloc[i,kakudo])) 37 mae=m.iloc[mk.index(min(mk)),:] 38 39 if df[(df["A"]==k.iloc[i,A])&(df["B"]==k.iloc[i,C])].empty: 40 continue 41 u=df[(df["A"]==k.iloc[i,A])&(df["B"]==k.iloc[i,C])] 42 43 if len(u)==0: 44 ushiro=pd.DataFrame([None,None,None,None,None,None],columns=collist) 45 elif len(u)==1: 46 ushiro=u 47 else: 48 uk=[] 49 for y in range(len(u)): 50 uk.append(min(abs(u.iloc[y,kakudo]-k.iloc[i,kakudo]),360-u.iloc[y,kakudo]+k.iloc[i,kakudo])) 51 ushiro=u.iloc[uk.index(min(uk)),:] 52 53 df.at[k_index[i],collist[n]]=2/(1/mae[collist[n]]+1/ushiro[collist[n]])##ここの計算結果がnanの場合,欠損は埋めずに次のループに入る 54 55 print(df)

###発生しているエラー
ValueError: setting an array element with a sequence.

###出来ていること
dfのe列,index=8までは思い通りに実装できています.

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

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

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

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

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

ikadzuchi

2018/12/12 01:12

そこまで仕様が明確なら容易にコードが書けそうなものですが、何がわからないのでしょう。逆に、何ならできますか? データの入出力はできますか?
can110

2018/12/13 01:19

NameError: name 'ketu' is not defined が発生します。 実行可能なコードを提示されると回答得られやすくなります。
guest

回答1

0

ベストアンサー

こちらの質問の回答で解決しました.
https://teratail.com/questions/163860

投稿2018/12/14 07:42

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問