2017-03-24 3 views
0

更新:
私のデータセットには、3つの列(x、y)とVALUEがあります。 (すでにソート)このように見ています:列内に与える値を持つ行を残す

df1: 
x , y ,value 
1 , 1 , 12 
2 , 2 , 12 
4 , 3 , 12 
1 , 1 , 11 
2 , 2 , 11 
4 , 3 , 11 
1 , 1 , 33 
2 , 2 , 33 
4 , 3 , 33 

私は、(XとYの列で)それらbewteen距離は= 1 <あり、その私の半径を言うことができますそれらの行を取得する必要があります。しかし、同時に私は値が等しいものだけをグループ化してフィルタリングする必要があります。 1つのヘッダがあったので 私は1つのデータセットのそれを比較するために問題を抱えていたので、私はPythonコマンドを有する第2のデータセットを作成しました:

def dist_value_comp(row):       
x_dist = abs(df['y'] - row['y']) <= 1 
y_dist = abs(df['x'] - row['x']) <= 1 
xy_dist = x_dist & y_dist 
max_value = df.loc[xy_dist, 'value'].max() 
return row['value'] == max_value 

df['keep_row'] = df.apply(dist_value_comp, axis=1) 
df.loc[df['keep_row'], ['x', 'y', 'value']] 

df: 
x , y ,value 
1 , 1 , 12 
2 , 2 , 12 
4 , 3 , 12 
x , y ,value 
1 , 1 , 11 
2 , 2 , 11 
4 , 3 , 11 
x , y ,value 
1 , 1 , 33 
2 , 2 , 33 
4 , 3 , 33 

私はこのコードを使用しようとしました

filtered_df = df[df.apply(lambda line: abs(line['x']- line['y']) <= 1, 1)] 
for i in filtered_df.groupby('value'): 
    print(i) 

不良データフレームに接続されたエラーを受け取る前に、修復しましたが、まだ出力結果がありません。 これはdf1から新しいデータフレームdfを作成する方法です。ここに入れておくとよいでしょう。常にテーブルを印刷するので、大きなマイナスがあります。そして、私はそれをもう一度テストし、このdefは私に空のDataFrameを与えます。

VALUE1= df1.VALUE.unique() 
def separator(): 
    lst=[] 
    for VALUE in VALUE1: 
     abc= df1[df1.VALUE==VALUE] 
     print abc 
    return lst 

ab=separator() 
df=pd.DataFrame(ab) 

私は、通常のデータセットDF1をしようとしていたとき、私は= 1

アカウントの半径を考慮することなく、出力上のすべてのデータを持っている私はこの1つのように私の出力テーブルの上に取得する必要があります:

x , y ,value 
1 , 1 , 12 
2 , 2 , 12 
x , y ,value 
1 , 1 , 11 
2 , 2 , 11 
x , y ,value 
1 , 1 , 33 
2 , 2 , 33 

UPDATE 2:

私はこのコードで今働いています:

filtered_df = df[df.apply(lambda line: abs(line['x']- line['y']) <= 1, 1)] 
for i in filtered_df.groupby('value'): 
print(i) 

私は出力として見ていますが、私が出力を見ているときは、何の価値があるか分からないので、 は何もしていません。なぜなら、半径+/- 1を使用する必要があります。おもう。 私のデータセットにはもっと多くの列がありますので、私の4番目と5番目の列 'D' & 'E'を考慮に入れることができるので、列Dの最小値であるこの行から半径が取られます。& E

出力結果は、私が望むのと同じでなければなりませんが、今私はこの場合、半径+/- 1のどの値から開始するのかを知っています。 誰でも今私を助けることができますか? ご迷惑をおかけして申し訳ありません!

答えて

0

私が理解しているところでは、操作を行う順番(距離が< = 1のものをフィルタリングしてグループ化する)は重要ではありません。

#first selection of the lines with right distance 
filtered_df = df[df.apply(lambda line: abs(line['x']- line['y']) <= 1, 1)] 

# Then group 
for i in filtered_df.groupby('value'): 
    print(i) 
    # Or do whatever you want 

あなたは、コードの一部がどのように機能するかについて、いくつかの説明をしたい場合は、私に教えてください:

は、ここに私のテイクです。

+0

こんにちは、前と同じエラーがあります。 'filtered_df = df [df。AttributeError: 'NoneType'オブジェクトには属性 'apply'がありません – Pawe

+0

正しくロードしてもよろしいですか?(lambda line:abs(line ['A'] - line ['B'])あなたが私たちに示したデータフレーム? 'df'オブジェクトがデータフレームではなく' None'にマップされているようです – LoicM

+0

私の質問が更新されました。 – Pawe

関連する問題