pandas 使用Groupby计算一列中的唯一组合

cgyqldqp  于 2023-01-07  发布在  其他
关注(0)|答案(1)|浏览(148)

我有一个 Dataframe ,我试图创建新的列显示不同的组合在不同的组内的发生。我发现的解决方案是所有的组合值跨越2个或更多列,而不是一个。因此,希望有人能帮助。
样品DF:

╔════╦═════╗
║ id ║ tag ║
╠════╬═════╣
║ a  ║   1 ║
║ a  ║   1 ║
║ a  ║   2 ║
║ a  ║   2 ║
║ a  ║   3 ║
║ a  ║   3 ║
║ b  ║   2 ║
║ b  ║   2 ║
║ b  ║   2 ║
║ b  ║   3 ║
║ b  ║   3 ║
║ b  ║   3 ║
╚════╩═════╝

希望得到产出:

╔════╦═════╦═════╦═════╦═════╦═════╦═════╦═════╗
║ id ║ tag ║ 1,1 ║ 1,2 ║ 1,3 ║ 2,2 ║ 2,3 ║ 3,3 ║
╠════╬═════╬═════╬═════╬═════╬═════╬═════╬═════╣
║ a  ║   1 ║   1 ║   4 ║   4 ║   1 ║   4 ║   1 ║
║ a  ║   1 ║   1 ║   4 ║   4 ║   1 ║   4 ║   1 ║
║ a  ║   2 ║   1 ║   4 ║   4 ║   1 ║   4 ║   1 ║
║ a  ║   2 ║   1 ║   4 ║   4 ║   1 ║   4 ║   1 ║
║ a  ║   3 ║   1 ║   4 ║   4 ║   1 ║   4 ║   1 ║
║ a  ║   3 ║   1 ║   4 ║   4 ║   1 ║   4 ║   1 ║
║ b  ║   2 ║   0 ║   0 ║   0 ║   3 ║   9 ║   3 ║
║ b  ║   2 ║   0 ║   0 ║   0 ║   3 ║   9 ║   3 ║
║ b  ║   2 ║   0 ║   0 ║   0 ║   3 ║   9 ║   3 ║
║ b  ║   3 ║   0 ║   0 ║   0 ║   3 ║   9 ║   3 ║
║ b  ║   3 ║   0 ║   0 ║   0 ║   3 ║   9 ║   3 ║
║ b  ║   3 ║   0 ║   0 ║   0 ║   3 ║   9 ║   3 ║
╚════╩═════╩═════╩═════╩═════╩═════╩═════╩═════╝

示例df代码:

data = {
    "id": ['a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'b'],
    "tag": [1, 1, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3]}

df = pd.DataFrame(data)

澄清:“col“x,y”是按id”分组的标记值的组合,如@Chrysophylaxs(谢谢)所述。
忠告

nzk0hqpo

nzk0hqpo1#

我在这里得到了答案:

data = {
    "id": ['a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'b'],
    "tag": [1, 1, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3]}

df = pd.DataFrame(data)

from itertools import combinations

df['combinations'] = df.groupby(['id']).transform(lambda x: str(list(combinations(x.to_list(), 2))))
df['combinations'] = df['combinations'].apply(lambda x: x.replace('[', '').replace(']', '').replace('),', '*').replace(', ','-').replace('*',',').replace('(','').replace(')','').replace(' ','')).str.split(',')
df2 = df.drop_duplicates(['combinations'])

x = df2.explode('combinations')
x = x.drop('tag', axis=1).groupby(['id', 'combinations']).value_counts().unstack().reset_index().fillna(0)
df.merge(x, on='id', how='left').drop('combinations', axis=1)

输出:

id  tag 1-1 1-2 1-3 2-2 2-3 3-3
0   a   1   1.0 4.0 4.0 1.0 4.0 1.0
1   a   1   1.0 4.0 4.0 1.0 4.0 1.0
2   a   2   1.0 4.0 4.0 1.0 4.0 1.0
3   a   2   1.0 4.0 4.0 1.0 4.0 1.0
4   a   3   1.0 4.0 4.0 1.0 4.0 1.0
5   a   3   1.0 4.0 4.0 1.0 4.0 1.0
6   b   2   0.0 0.0 0.0 3.0 9.0 3.0
7   b   2   0.0 0.0 0.0 3.0 9.0 3.0
8   b   2   0.0 0.0 0.0 3.0 9.0 3.0
9   b   3   0.0 0.0 0.0 3.0 9.0 3.0
10  b   3   0.0 0.0 0.0 3.0 9.0 3.0
11  b   3   0.0 0.0 0.0 3.0 9.0 3.0

相关问题