如何解决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 举报,一经查实,本站将立刻删除。