为了账号安全,请及时绑定邮箱和手机立即绑定

数据框中的所有唯一列组合

数据框中的所有唯一列组合

潇潇雨雨 2022-11-18 16:47:35
我正在尝试在 dataframe 中创建所有可能的唯一列组合。因此,具有 A、B、C 和 D 列,组合将是AB、AC、AD、BC、BD、ABC、ABD。A   B   C   D   AB   AC   AD ...1   1   3   2   2    4    3为此,我创建了一个 for 循环:for i, comb in enumerate(df_p.columns):    for comb2 in df_p.columns[i:]:        if (comb != comb2) & (comb not in comb2)):            df_p[comb + ' + ' + comb2] = df_p[comb].astype('str') + ' + ' + df_p[comb2].astype("str")            print(" comb: " + comb + " combines with comb2: " + comb2)基本上,“comb”迭代器从第一列 (A) 开始,第二个迭代器“comb2”从第二列 (B) 开始,创建 AB,然后继续直到创建所有 A 组合。然后,当 comb 到 B 时,comb2 从 C 开始,依此类推。if 条件阻止了 A + A 以及 A + BA 之类的事情(我在 df 中用更多的列测试它时遇到了一些错误)。我现在的问题是关于反向重复项,比如当迭代器一位于字母 A 时创建“ABD”(并且迭代器二将它与所有列组合)以及当迭代器一位于 D 时创建“DBA”而迭代器二完成所有操作组合。在我的研究中,我也尝试过使用 itertools 组合,如下所示:set(itertools.combinations(df_p.columns, 2))对于 2 的组合,对于其他所有可能的组合,依此类推,但是后来我遇到了麻烦“映射”新创建的列组合(如 AB)与行值我原来的 df(对于这个例子,这将是 A 的行值 + B 的行值)。我更喜欢 itertools 选项,因为它可以更好地控制我们想要的组合数量,而且可能不难映射。有什么想法吗?提前致谢。
查看完整描述

2 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

IIUC,combinationsreduceSeries.add

from itertools import combinations

from functools import reduce

cols = df.columns.copy()

for i in range(2, len(cols) + 1):

    for names in combinations(cols, i):

        df[''.join(names)] = reduce(lambda cum_serie, new_serie_name: \

                                    cum_serie.add(df[new_serie_name]),

                                    names[1:],

                                    df[names[0]])



print(df)

输出


   A  B  C  D  AB  AC  AD  BC  BD  CD  ABC  ABD  ACD  BCD  ABCD

0  1  1  3  2   2   4   3   4   3   5    5    4    6    6     7

编辑


df = df.rename(columns=str).astype(str)

cols = df.columns.copy()

for i in range(2, len(cols) + 1):

    for names in combinations(cols, i):

        df[' + '.join(names)] = reduce(lambda cum_serie, new_serie_name: \

                                    cum_serie.str.cat(df[new_serie_name], ' + '),

                                    names[1:],

                                    df[names[0]])

print(df)


   A  B  C  D  A + B  A + C  A + D  B + C  B + D  C + D  A + B + C  A + B + D  \

0  1  1  3  2  1 + 1  1 + 3  1 + 2  1 + 3  1 + 2  3 + 2  1 + 1 + 3  1 + 1 + 2   


   A + C + D  B + C + D  A + B + C + D  

0  1 + 3 + 2  1 + 3 + 2  1 + 1 + 3 + 2  


查看完整回答
反对 回复 2022-11-18
?
暮色呼如

TA贡献1853条经验 获得超9个赞

我认为使用combinations是正确的方法。


首先创建列组合列表:


col_combs = list(combinations(df.columns, 2))


然后要获取仅包含任何给定组合的那些列的 df,将组合元组转换为列表,并将其传递给数据框。


cols = list(col_combs[0]

comb_df = `df[col_combs)]

下面是一个最小示例,说明如何为 2 列的每个组合存储单独的数据框:


col_combs = list(combinations(df.columns, 2))


comb_dfs = []


for cols in col_combs:

    temp = df[list(cols)].copy()

    comb_dfs.append(temp)

为了让它适用于更多的列组合,您只需combinations使用您想要的值运行几个不同的值,并在制作数据框之前将所有结果收集到一个列表中。


查看完整回答
反对 回复 2022-11-18
  • 2 回答
  • 0 关注
  • 70 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信