微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pandas:如何将具有相同列值的多行组合起来并创建一个涵盖所有可能性的新 Dataframe?

如何解决Pandas:如何将具有相同列值的多行组合起来并创建一个涵盖所有可能性的新 Dataframe?

在这样的 DataFrame:

id 名称 年龄
0x0 汉斯 32
0x0 彼得 21
0x1 一月 42
0x1 西蒙 25
0x1 克劳斯 51
0x1 弗兰兹 72

我的目标是创建一个 DataFrame 来覆盖同一 ID 内的任何可能组合

ID 0x0 的唯一可能是 Hans 和 Peter。由于 ID 0x1 存在四次,因此有六种可能的解决方案,如下表所示。

由于这是一个示例,一个 ID 也可能存在 3、5、7、... 次,这会导致或多或少的可能性。

id name0 age0 name1 age1
0x0 汉斯 32 彼得 21
0x1 一月 42 西蒙 25
0x1 一月 42 克劳斯 51
0x1 一月 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"],'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)

解决方法

Core python itertools combinations 是解决方案。 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,1],"name"],suffixes=("0","1"))
    .drop(columns=["level_1",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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。