Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.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 大熊猫的组合聚集_Python_Pandas_Group By - Fatal编程技术网

Python 大熊猫的组合聚集

Python 大熊猫的组合聚集,python,pandas,group-by,Python,Pandas,Group By,我有这种格式的数据 ID Val 1 A 1 B 1 C 2 A 2 C 2 D 我想按每个ID的数据分组,查看存在的组合,并将多个组合相加。结果输出应该如下所示 v1 v2 count A B 1 A C 2 A D 1 B C 1 C D 1 有没有一种聪明的方法来实现这一点,而不是循环使用每种可能的组合?我想到的是: 使用pd.merge创建笛卡尔积 过滤笛卡尔积,使其仅包含所需形式的组合 计算组合的数量 转换为所需的数据帧格式 不确定它是否比循环所有可能的组合更快 #!/usr/bi

我有这种格式的数据

ID Val
1 A
1 B
1 C
2 A
2 C
2 D
我想按每个ID的数据分组,查看存在的组合,并将多个组合相加。结果输出应该如下所示

v1 v2 count
A B 1
A C 2
A D 1
B C 1
C D 1
有没有一种聪明的方法来实现这一点,而不是循环使用每种可能的组合?

我想到的是:

使用pd.merge创建笛卡尔积 过滤笛卡尔积,使其仅包含所需形式的组合 计算组合的数量 转换为所需的数据帧格式 不确定它是否比循环所有可能的组合更快

#!/usr/bin/env python2.7
# encoding: utf-8
'''
'''
import pandas as pd
from itertools import izip

# Create the dataframe
df = pd.DataFrame([
    [1, 'A'],
    [1, 'B'],
    [1, 'C'],
    [2, 'A'],
    [2, 'C'],
    [2, 'D'],
], columns=['ID', 'Val'])
'''
   ID Val
0   1   A
1   1   B
2   1   C
3   2   A
4   2   C
5   2   D

[6 rows x 2 columns]
'''

# Create the cartesian product
df2 = pd.merge(df, df, on='ID')
'''
    ID Val_x Val_y
0    1     A     A
1    1     A     B
2    1     A     C
3    1     B     A
4    1     B     B
5    1     B     C
6    1     C     A
7    1     C     B
8    1     C     C
9    2     A     A
10   2     A     C
11   2     A     D
12   2     C     A
13   2     C     C
14   2     C     D
15   2     D     A
16   2     D     C
17   2     D     D

[18 rows x 3 columns]
'''

# Count the values, filtering A, A pairs, and B, A pairs.
counts = pd.Series([
    v for v in izip(df2.Val_x, df2.Val_y)
    if v[0] != v[1] and v[0] < v[1]
]).value_counts(sort=False).sort_index()
'''
(A, B)    1
(A, C)    2
(A, D)    1
(B, C)    1
(C, D)    1
dtype: int64
'''

# Combine the counts
df3 = pd.DataFrame(dict(
    v1=[v1 for v1, _ in counts.index],
    v2=[v2 for _, v2 in counts.index],
    count=counts.values
))
'''
   count v1 v2
0      1  A  B
1      2  A  C
2      1  A  D
3      1  B  C
4      1  C  D
'''
我想到的是:

使用pd.merge创建笛卡尔积 过滤笛卡尔积,使其仅包含所需形式的组合 计算组合的数量 转换为所需的数据帧格式 不确定它是否比循环所有可能的组合更快

#!/usr/bin/env python2.7
# encoding: utf-8
'''
'''
import pandas as pd
from itertools import izip

# Create the dataframe
df = pd.DataFrame([
    [1, 'A'],
    [1, 'B'],
    [1, 'C'],
    [2, 'A'],
    [2, 'C'],
    [2, 'D'],
], columns=['ID', 'Val'])
'''
   ID Val
0   1   A
1   1   B
2   1   C
3   2   A
4   2   C
5   2   D

[6 rows x 2 columns]
'''

# Create the cartesian product
df2 = pd.merge(df, df, on='ID')
'''
    ID Val_x Val_y
0    1     A     A
1    1     A     B
2    1     A     C
3    1     B     A
4    1     B     B
5    1     B     C
6    1     C     A
7    1     C     B
8    1     C     C
9    2     A     A
10   2     A     C
11   2     A     D
12   2     C     A
13   2     C     C
14   2     C     D
15   2     D     A
16   2     D     C
17   2     D     D

[18 rows x 3 columns]
'''

# Count the values, filtering A, A pairs, and B, A pairs.
counts = pd.Series([
    v for v in izip(df2.Val_x, df2.Val_y)
    if v[0] != v[1] and v[0] < v[1]
]).value_counts(sort=False).sort_index()
'''
(A, B)    1
(A, C)    2
(A, D)    1
(B, C)    1
(C, D)    1
dtype: int64
'''

# Combine the counts
df3 = pd.DataFrame(dict(
    v1=[v1 for v1, _ in counts.index],
    v2=[v2 for _, v2 in counts.index],
    count=counts.values
))
'''
   count v1 v2
0      1  A  B
1      2  A  C
2      1  A  D
3      1  B  C
4      1  C  D
'''
这应该起作用:

>>> ts = df.groupby('Val')['ID'].aggregate(lambda ts: set(ts))
>>> ts
Val
A      set([1, 2])
B         set([1])
C      set([1, 2])
D         set([2])
Name: ID, dtype: object
>>> from itertools import product
>>> pd.DataFrame([[i, j, len(ts[i] & ts[j])] for i, j in product(ts.index, ts.index) if i < j], 
...              columns=['v1', 'v2', 'count'])
  v1 v2  count
0  A  B      1
1  A  C      2
2  A  D      1
3  B  C      1
4  B  D      0
5  C  D      1
这应该起作用:

>>> ts = df.groupby('Val')['ID'].aggregate(lambda ts: set(ts))
>>> ts
Val
A      set([1, 2])
B         set([1])
C      set([1, 2])
D         set([2])
Name: ID, dtype: object
>>> from itertools import product
>>> pd.DataFrame([[i, j, len(ts[i] & ts[j])] for i, j in product(ts.index, ts.index) if i < j], 
...              columns=['v1', 'v2', 'count'])
  v1 v2  count
0  A  B      1
1  A  C      2
2  A  D      1
3  B  C      1
4  B  D      0
5  C  D      1