次のような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]
コメントを追加