首页 > 解决方案 > 在 Pandas 中组合两个数据框以生成多对多关系

问题描述

我有两个清单,比如说

customers = ['a', 'b', 'c']
accounts = [1, 2, 3, 4, 5, 6, 7, 8, 9]

我想生成一个 Pandas 数据框,所以:

  1. 使用所有客户和帐户
  2. 客户和帐户之间存在多对多关系(一个客户“可能”有多个帐户,一个帐户“可能”由多个客户拥有
  3. 我希望多对多关系是随机的。也就是说,有些客户将拥有一个帐户,而有些客户将拥有多个帐户。同样,某些帐户将仅由一位客户拥有,而其他帐户将由多个客户拥有。

就像是,

顾客 帐户
一个 1
一个 2
b 2
C 3
一个 4
b 4
C 4
b 5
b 6
b 7
b 8
一个 9

由于我正在生成随机数据,在最坏的情况下,如果代码更简单(基本上放宽了上述要求 1),我可以生成太多帐户并丢弃未使用的帐户。

我正在使用sample (n=20, replace=True)在两个数据框中生成 20 条记录,然后根据索引将它们合并为一条。是否有开箱即用的 API 或库来执行此操作,或者我的代码是推荐的方式?

customers = ['a', 'b', 'c']
accounts = [1, 2, 3, 4, 5, 6, 7, 8, 9]

customers_df = pd.DataFrame(data=customers)
customers_df = customers_df.sample (n=20, replace=True)
customers_df['new_index'] = range (20)
customers_df.set_index ('new_index', inplace=True)
accounts_df = pd.DataFrame (data=accounts)
accounts_df = accounts_df.sample (n=20, replace=True)
accounts_df['new_index'] = range (20)
accounts_df.set_index ('new_index', inplace=True)
combined_df = pd.merge (customers_df, accounts_df, on='new_index')
print (combined_df)

编辑:修改了问题并添加了我尝试过的示例代码。

标签: pandasdataframerandommany-to-manyassociations

解决方案


实现此目的的一种方法是收集与笛卡尔积的所有可能关系的集合,然后在构建数据框之前从该列表中进行选择:

import itertools
import random

customers = ['a', 'b', 'c']
accounts = [1, 2, 3, 4, 5, 6, 7, 8, 9]
possible_associations = [ca for ca in itertools.product(customers, accounts)]
df = pd.DataFrame.from_records(random.choices(possible_associations, k=20), columns=['customers', 'accounts']).sort_values(['customers','accounts'])
print(df)

输出

   customers  accounts
0          a         2
3          a         2
15         a         2
18         a         4
16         a         5
14         a         7
7          a         8
12         a         8
1          a         9
2          b         5
9          b         5
8          b         8
11         b         8
19         c         2
17         c         3
5          c         4
4          c         5
6          c         5
13         c         5
10         c         7

推荐阅读