pandas - 在 Pandas 中组合两个数据框以生成多对多关系
问题描述
我有两个清单,比如说
customers = ['a', 'b', 'c']
accounts = [1, 2, 3, 4, 5, 6, 7, 8, 9]
我想生成一个 Pandas 数据框,所以:
- 使用所有客户和帐户
- 客户和帐户之间存在多对多关系(一个客户“可能”有多个帐户,一个帐户“可能”由多个客户拥有
- 我希望多对多关系是随机的。也就是说,有些客户将拥有一个帐户,而有些客户将拥有多个帐户。同样,某些帐户将仅由一位客户拥有,而其他帐户将由多个客户拥有。
就像是,
顾客 | 帐户 |
---|---|
一个 | 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)
编辑:修改了问题并添加了我尝试过的示例代码。
解决方案
实现此目的的一种方法是收集与笛卡尔积的所有可能关系的集合,然后在构建数据框之前从该列表中进行选择:
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
推荐阅读
- c# - 将来自 Rest API 的图像内容插入到 Microsoft Word 中当前打开的文档中
- ios - 将 A 的位置转换为与 B 相同的位置
- python - Panda 系列插入错误缺少位置参数并且与索引长度不匹配
- python - 为什么无论级别如何都评估python中的日志记录语句?
- angular - 注入 Angular 单元测试时找不到提供程序?
- debugging - 按时间顺序对 Safari 调试器网络选项卡进行排序
- join - 使用 awk 合并多个管道分隔文件?
- c++ - C++ 函数重载和 initializer_list 构造函数
- jquery - .php 文件中的 Visual Studio Code jQuery 智能感知
- tfs - 是否可以将文件夹从一组 TFS 分支移动到另一组并保留挂起的更改?