パンダ:同じ列値を持つ複数の行を組み合わせて、すべての可能性をカバーする新しいデータフレームを作成するにはどうすればよいですか?

ロイヤルフラッシュ

次のようなDataFrameが存在します。

id 名前 年齢
0x0 ハンス 32
0x0 ピーター 21
0x1 1月 42
0x1 サイモン 25
0x1 クラウス 51
0x1 フランツ 72

同じID内の可能な組み合わせをカバーするDataFrameを作成することを目指しています

ID 0x0の唯一の可能性は、ハンスとピーターです。ID 0x1は4回存在するため、次の表に示すように、6つの解決策が考えられます。

これは例であるため、1つのIDが3、5、7、...回存在する可能性もあり、その結果、多かれ少なかれ可能性があります。

id name0 age0 name1 年齢1
0x0 ハンス 32 ピーター 21
0x1 1月 42 サイモン 25
0x1 1月 42 クラウス 51
0x1 1月 42 フランツ 72
0x1 サイモン 25 クラウス 51
0x1 サイモン 25 フランツ 72
0x1 クラウス 51 フランツ 72

組み合わせを使えば、可能性の側面はすでにカバーできますが、途中でそれぞれの名前の年齢を失っています。

import pandas as pd
from  itertools import combinations

data = pd.DataFrame({'id': ["0x0", "0x0", "0x1", "0x1", "0x1", "0x1"], 'name': ["Hans","Peter","Jan","Simon","Klaus","Franz"], 'age': [32, 21, 42, 25, 51, 72]})

df = (data.groupby('id')['name'].apply(lambda x: pd.DataFrame(list(combinations(x,2))))
        .reset_index(level=1, drop=True)
        .reset_index())
print(df)

ロブレイモンド

コアpythonitertoolsの組み合わせが解決策です。年齢merge()を取得するには

import itertools
df = pd.read_csv(io.StringIO("""id  name    age
0x0 Hans    32
0x0 Peter   21
0x1 Jan 42
0x1 Simon   25
0x1 Klaus   51
0x1 Franz   72"""), sep="\t")

df1 = (
df
    .groupby(["id"])["name"]
    .apply(lambda x: pd.DataFrame(itertools.combinations(list(x),2)))
    .reset_index()
    .merge(df, left_on=["id",0], right_on=["id","name"])
    .merge(df, left_on=["id",1], right_on=["id","name"], suffixes=("0","1"))
    .drop(columns=["level_1",0,1])
)

出力

  id  name0  age0  name1  age1
 0x0   Hans    32  Peter    21
 0x1    Jan    42  Simon    25
 0x1    Jan    42  Klaus    51
 0x1  Simon    25  Klaus    51
 0x1    Jan    42  Franz    72
 0x1  Simon    25  Franz    72
 0x1  Klaus    51  Franz    72

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ