Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算dataframe列中最常见的值组合_Python_Pandas - Fatal编程技术网

Python 计算dataframe列中最常见的值组合

Python 计算dataframe列中最常见的值组合,python,pandas,Python,Pandas,我有以下形式的数据帧: ID Product 1 A 1 B 2 A 3 A 3 C 3 D 4 A 4 B 我想从按ID分组的Product列中计算两个值的最常见组合。 因此,对于本例,预期结果为: Combination Count A-B 2 A-C 1 A-D 1 C-D 1 pandas是否可以进行此输出?我们可以在ID中进行合并,并过滤掉重复的合并(我假设您有一个默认的范

我有以下形式的数据帧:

ID Product
1   A
1   B
2   A 
3   A
3   C 
3   D 
4   A
4   B
我想从按
ID
分组的
Product
列中计算两个值的最常见组合。 因此,对于本例,预期结果为:

Combination Count
A-B          2
A-C          1
A-D          1
C-D          1

pandas是否可以进行此输出?

我们可以在ID中进行
合并
,并过滤掉重复的合并(我假设您有一个默认的
范围索引
)。然后我们进行排序,使分组与顺序无关:

import pandas as pd
import numpy as np

df1 = df.reset_index()
df1 = df1.merge(df1, on='ID').query('index_x > index_y')

df1 = pd.DataFrame(np.sort(df1[['Product_x', 'Product_y']].to_numpy(), axis=1))
df1.groupby([*df1]).size()


您可以使用
itertools
中的
组合
,以及
groupby
apply

from itertools import combinations

def get_combs(x):
    return pd.DataFrame({'Combination': list(combinations(x.Product.values, 2))})

使用
itertools.compositions
explode
value\u counts

import itertools

(df.groupby('ID').Product.agg(lambda x: list(itertools.combinations(x,2)))
                 .explode().str.join('-').value_counts())

Out[611]:
A-B    2
C-D    1
A-D    1
A-C    1
Name: Product, dtype: int64

或:

import itertools

(df.groupby('ID').Product.agg(lambda x: list(map('-'.join, itertools.combinations(x,2))))
                 .explode().value_counts())

Out[597]:
A-B    2
C-D    1
A-D    1
A-C    1
Name: Product, dtype: int64

使用
itertools
计数器

import itertools
from collections import Counter

agg_ = lambda x: tuple(itertools.combinations(x, 2))
product = list(itertools.chain(*df.groupby('ID').agg({'Product': lambda x: agg_(sorted(x))}).Product))
# You actually do not need to wrap product with list. The generator is ok
counts = Counter(product)
输出

Counter({('A', 'B'): 2, ('A', 'C'): 1, ('A', 'D'): 1, ('C', 'D'): 1})
您还可以执行以下操作来获取数据帧

pd.DataFrame(list(counts.items()), columns=['combination', 'count'])

  combination  count
0      (A, B)      2
1      (A, C)      1
2      (A, D)      1
3      (C, D)      1

itertools.组合的另一个技巧
功能:

from itertools import combinations
import pandas as pd

test_df = ... # your df
counts_df = test_df.groupby('ID')['Product'].agg(lambda x: list(combinations(x, 2)))\
    .apply(pd.Series).stack().value_counts().to_frame()\
    .reset_index().rename(columns={'index': 'Combination', 0:'Count'})
print(counts_df)
输出:

  Combination  Count
0      (A, B)      2
1      (A, C)      1
2      (A, D)      1
3      (C, D)      1
pd.DataFrame(list(counts.items()), columns=['combination', 'count'])

  combination  count
0      (A, B)      2
1      (A, C)      1
2      (A, D)      1
3      (C, D)      1
from itertools import combinations
import pandas as pd

test_df = ... # your df
counts_df = test_df.groupby('ID')['Product'].agg(lambda x: list(combinations(x, 2)))\
    .apply(pd.Series).stack().value_counts().to_frame()\
    .reset_index().rename(columns={'index': 'Combination', 0:'Count'})
print(counts_df)
  Combination  Count
0      (A, B)      2
1      (A, C)      1
2      (A, D)      1
3      (C, D)      1