根据两列中值的组合制作小型 pandas 数据框

Make small pandas dataframes based on combinations of values in two columns

假设我下面有一个数据框。

A   B
a   1
a   2
a   3
b   1
b   2
b   3
c   1
c   2
c   3
d   1

我想创建包含两列的数据框:A:A 列和 B 列中的唯一值:B 列中 A 中给定唯一值的可能值。请注意,所有这些数据框都必须是唯一的。下图给出了一些可能的数据帧示例:

主要思想是按 A 列对值进行分组,在列表中收集 B 中的值,创建所有这些列表的笛卡尔积,然后格式化回数据框

首先我们按A列加载数据和groupby,将B中的所有值收集到列表中:

from io import StringIO
import pandas as pd
data = StringIO('''
A   B
a   1
a   2
a   3
b   1
b   2
b   3
c   1
c   2
c   3
d   1
''')
df = pd.read_csv(data, sep = '\s+')
df2 = df.groupby('A').agg(list)
df2

df2 看起来像这样:


    B
A   
a   [1, 2, 3]
b   [1, 2, 3]
c   [1, 2, 3]
d   [1]

接下来我们将B列中的所有列表提取到列表列表中:

all_lists = df2['B'].to_list()
all_lists

看起来像这样:

[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1]]

现在是主要步骤,使用 MultiIndex.from_product 功能创建列表产品

mi = pd.MultiIndex.from_product(all_lists)
mi

mi 看起来像这样:

MultiIndex([(1, 1, 1, 1),
            (1, 1, 2, 1),
            (1, 1, 3, 1),
            (1, 2, 1, 1),
            (1, 2, 2, 1),
            (1, 2, 3, 1),
            (1, 3, 1, 1),
            (1, 3, 2, 1),
            (1, 3, 3, 1),
            (2, 1, 1, 1),
            (2, 1, 2, 1),
            (2, 1, 3, 1),
            (2, 2, 1, 1),
            (2, 2, 2, 1),
            (2, 2, 3, 1),
            (2, 3, 1, 1),
            (2, 3, 2, 1),
            (2, 3, 3, 1),
            (3, 1, 1, 1),
            (3, 1, 2, 1),
            (3, 1, 3, 1),
            (3, 2, 1, 1),
            (3, 2, 2, 1),
            (3, 2, 3, 1),
            (3, 3, 1, 1),
            (3, 3, 2, 1),
            (3, 3, 3, 1)],
           )

我们快完成了——现在转换成 df 并确保我们有正确的标签。同时删除重复项(none 在这种情况下,但通常是个好主意)

(pd.DataFrame(index = mi)
    .reset_index()
    .drop_duplicates()
    .set_axis(df2.index, axis=1) 
    .T
)

我们得到一个数据框:

    0   1   2   3   4   5   6   7   8   9   ... 17  18  19  20  21  22  23  24  25  26
A                                                                                   
a   1   1   1   1   1   1   1   1   1   2   ... 2   3   3   3   3   3   3   3   3   3
b   1   1   1   2   2   2   3   3   3   1   ... 3   1   1   1   2   2   2   3   3   3
c   1   2   3   1   2   3   1   2   3   1   ... 3   1   2   3   1   2   3   1   2   3
d   1   1   1   1   1   1   1   1   1   1   ... 1   1   1   1   1   1   1   1   1   1

其中索引是旧列 A,每列都是旧列 B 中相关值的唯一组合

如果需要,您可以将其拆分为单独的数据帧,如果您愿意,可以循环遍历列