【发布时间】:2020-05-13 08:25:09
【问题描述】:
感谢阅读。
我正在尝试创建数据框中所有可能的唯一列组合。因此,具有 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 选项,因为它可以更好地控制我们想要多少组合,而且映射起来可能并不难。有什么想法吗?
提前致谢。
----------------------更新------------ -----------------------------
为了清楚起见,我忘了提到行是字符串。这是真实列的sn-p:
retired nationality region
1 Portugal Lisbon
因此,例如创建这 3 个的所有组合将是:
retired nationality region retired + nationality retired + region (..)
1 Portugal Lisbon 1 + Portugal 1 + Lisbon
【问题讨论】:
标签: python pandas combinations itertools