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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

Q&A

解決済

1回答

484閲覧

距離の条件によりデータフレームの複数行を1つに結合する方法について

mi2

総合スコア63

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

0グッド

1クリップ

投稿2020/03/16 07:21

編集2020/03/16 12:58

前提・実現したいこと

pandasのデータフレームにおいて、以下の例のように名前とx, yが存在しています。

これらから、

  • xの閾値の幅に対して, yがある閾値以内であれば結合し、1行にする
  • 1行にする際に、複数紐付いた場合は複数分でx, yの重心を取るように更新する

という処理を行う関数を書きたいです。(位置的に近いものを纏めたい)

インプットのデータフレームの例(3列)

name, x, y a, 10, 10 b, 12, 15 c, 11, 20 d, 21, 50 e, 23, 55 f, 22, 65 :

閾値の設定

x_threshold = 2 y_threshold = 5

アウトプットのデータフレームの例(3列)

name, x, y abc, 11, 15 de, 22, 52.5 f, 22, 65 :

考えたこと

閾値を見て、if文を書く感じになるかと思うのですが、 一行ずつ判定し、行方向で複数分纏めて行く方法がいまいちわからず手をこまねいております。
恐縮ではございますが、お知恵を拝借できましたら幸いです。
何卒よろしくお願い申し上げます。

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

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

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

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

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

meg_

2020/03/16 10:34

・閾値は±でしょうか?(xが10のとき-8から12?) ・範囲が重複する場合もありえると思いますが、その場合の処理はどうなりますか?
mi2

2020/03/16 12:56

> ・閾値は±でしょうか?(xが10のとき-8から12?) 申し訳ございません。閾値(x_threshold)は0より大きい正の整数(m=1,2,3,...)を想定しています。例えばx_threshold=2の場合、pandasのx=10という1行目に対して8<=x<=12が設定される範囲となります。x=12,11といった2行目と3行目が範囲に入ってくるため、今度はy側の距離を見て、y_threshold = 5以内のものがまとまるイメージです。わかりづらく申し訳ございません。 やりたいことは座標上で近くにあるデータを纏めて行きたいということになります。この方法に限らず、よりよい方法がございましたらご教示頂けましたら幸いです。。 > ・範囲が重複する場合 重複する場合は、より左側のものを優先的に選択されるようにしたいと考えております。(xの値が小さいもの)
meg_

2020/03/16 14:07

すみません。-8ではなく8でした。記入ミスです。 後半の質問についてはname,xに「a,10;b,11;c,12;d,13」がある場合、10を基準にすれば「8<=10,11,12<=12」となり結果は「abc,11」となりますが、11を基準にすれば 「9<=10,11,12,13<=13」となり結果は「abcd,11.5」となるかと思います。こういう場合はどちらを残すのか、どちらも残すのか、あるいはこういう場合はあり得ないのか、という意味の質問でした。
mi2

2020/03/16 23:40

ありがとうございます。後半の質問につきまして、説明が不足しておりました。 基準につきましてはxについての条件が合うものはどちらも残すで問題ございません。yの値との条件もあるので、実態としてはyの方の条件で不要なものが淘汰されるイメージとなります。 ご確認頂きありがとうございます。
meg_

2020/03/17 12:12

やりたいことはだいたい分かりました。 ところで、pandasの操作はどれくらい出来ますか? 質問の条件でデータを抽出することは出来ますか?
mi2

2020/03/18 00:02 編集

基本的なpandasによる抽出は出来るのですが、今回のように複数条件で優先されるものがこれのような少し複雑なものになるとどのように考えるべきか迷ってしまう部分がございます。申し訳ございません
guest

回答1

0

ベストアンサー

こんな感じでしょうか?

Python

1result = pd.DataFrame([], columns=df.columns) 2for index, row in df.iterrows(): 3 df2 = df[(df['x'] >= row['x'] - x_threshold) & (df['x'] <= row['x'] + x_threshold)] 4 df2 = df2[(df2['y'] >= row['y'] - y_threshold) & (df2['y'] <= row['y'] + y_threshold)] 5 6 data = df2.mean().values.tolist() 7 data.insert(0, ','.join(df2['name'].values)) 8 s = pd.Series(data, index=df.columns) 9 result = result.append(s, ignore_index=True) 10 11print(result) 12# name x y 13#0 a,b 11.0 12.5 14#1 a,b,c 11.0 15.0 15#2 b,c 11.5 17.5 16#3 d,e 22.0 52.5 17#4 d,e 22.0 52.5 18#5 f 22.0 65.0

投稿2020/03/18 11:00

meg_

総合スコア10602

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問