【问题标题】:Create all possible combinations of multiple columns in a Pandas DataFrame在 Pandas DataFrame 中创建多列的所有可能组合
【发布时间】:2019-11-18 01:36:17
【问题描述】:

鉴于以下DataFrame,

df = pd.DataFrame({'Student':['Siri','Alexa'], 'Class':['6', '7'], 'Section':['A','B'], 'Teacher':['Ravi','Mark'], 'School':['C','D']})

我想返回一个包含所有列值的所有可能组合的表。我使用下面的代码实现了这一点

df['key'] = 1

df1 = pd.merge(df.loc[:, ['key','Student']], df.loc[:,['key','Class']], how='outer')

df2 = df1.merge(df.loc[:,['key','Section']], how='outer')

df3 = df2.merge(df.loc[:,['key','Teacher']], how='outer')

df4 = df3.merge(df.loc[:,['key','School']], how='outer')

df4.drop(columns='key', inplace=True)

完成这项工作的最简单方法是什么,因为我有 15 列,通过上述方法,会导致 14 次合并和低效代码?

【问题讨论】:

  • This answer 可能有助于向您展示如何将其设置为循环

标签: python pandas dataframe


【解决方案1】:

你会喜欢:

from itertools import product

df = pd.DataFrame({'Student':['Siri','Alexa'], 'Class':['6', '7'], 'Section':['A','B'], 'Teacher':['Ravi','Mark'], 'School':['C','D']})

uniques = [df[i].unique().tolist() for i in df.columns ]
pd.DataFrame(product(*uniques), columns = df.columns)

这会导致每列中所有唯一条目的笛卡尔积。

   Student Class Section Teacher School
0     Siri     6       A    Ravi      C
1     Siri     6       A    Ravi      D
2     Siri     6       A    Mark      C
3     Siri     6       A    Mark      D
4     Siri     6       B    Ravi      C
5     Siri     6       B    Ravi      D
6     Siri     6       B    Mark      C
7     Siri     6       B    Mark      D
8     Siri     7       A    Ravi      C
9     Siri     7       A    Ravi      D
10    Siri     7       A    Mark      C
11    Siri     7       A    Mark      D
12    Siri     7       B    Ravi      C
13    Siri     7       B    Ravi      D
14    Siri     7       B    Mark      C
15    Siri     7       B    Mark      D
16   Alexa     6       A    Ravi      C
17   Alexa     6       A    Ravi      D
18   Alexa     6       A    Mark      C
19   Alexa     6       A    Mark      D
20   Alexa     6       B    Ravi      C
21   Alexa     6       B    Ravi      D
22   Alexa     6       B    Mark      C
23   Alexa     6       B    Mark      D
24   Alexa     7       A    Ravi      C
25   Alexa     7       A    Ravi      D
26   Alexa     7       A    Mark      C
27   Alexa     7       A    Mark      D
28   Alexa     7       B    Ravi      C
29   Alexa     7       B    Ravi      D
30   Alexa     7       B    Mark      C
31   Alexa     7       B    Mark      D

【讨论】:

  • 不错的解决方案,但是如果df 中的一列比其他列具有更多的唯一值怎么办?
  • 它仍然可以工作,他正在构建一个列表列表,而不是矩阵,因此它们可以有不同的长度。
  • 我收到这个错误 - raise TypeError("data argument can't be an iterator") TypeError: data argument can't be an iterator
  • @omer 如果您使用我回答中的代码,则不会。
【解决方案2】:

您正在寻找笛卡尔积。这可以通过itertools.product:

from itertools import product

prod = product(df['Class'].unique(), df['Section'].unique())
student_cols = [x for x in df.columns if x not in ('Class', 'Section')]
students = df[student_cols].drop_duplicates().values.tolist()

res = pd.DataFrame([s + list(p) for p in prod for s in students],
                   columns=list(student_cols+['Class', 'Section']))\
        .sort_values(list(student_cols+['Class', 'Section']))

print(res)

#   School Student Teacher Class Section
# 0      C    Siri    Ravi     6       A
# 2      C    Siri    Ravi     6       B
# 4      C    Siri    Ravi     7       A
# 6      C    Siri    Ravi     7       B
# 1      D   Alexa    Mark     6       A
# 3      D   Alexa    Mark     6       B
# 5      D   Alexa    Mark     7       A
# 7      D   Alexa    Mark     7       B

【讨论】:

  • @NarendraGadidasu,在这种情况下,您应该 edit 您的问题包括 5 列 - 并提及您有 15 列。然后人们会意识到这一事实,我们可以对此进行解释。
  • 编辑了问题。谢谢!
  • @NarendraGadidasu,你能用 5 列更新你的数据框并添加所需的输出吗?
  • 添加了一个 5 列的示例
猜你喜欢
  • 2012-07-11
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 2018-06-08
相关资源
最近更新 更多