python - 如何在 Pandas DataFrames 中管理 Numpy 数组
问题描述
假设有一个 DataFrame,其中包含一些整数值和一些以某种方式定义的数组:
df = pd.DataFrame(np.random.randint(0,100,size=(5, 1)), columns=['rand_int'])
array_a = np.arange(5)
array_b = np.arange(7)
df['array_a'] = df['rand_int'].apply(lambda x: array_a[:x])
df['array_b'] = df['rand_int'].apply(lambda x: array_b[:x])
一些可以帮助我理解如何使用 Pandas DataFrames 管理 Numpy 数组的问题:
- 如何将 df 中的 array_a 和 array_b 列定义为 rand_int 列中第 n 行中的项目之间的乘积?
- 是否可以创建另一列,让我们将其
array_diff
命名为每行的 array_a 和 array_b 之间的 np.setdiff1d?
解决方案
我会说最好使用 NumPy 并将数据导入数据框作为最后一步。
无论如何,这是一个将数组逐步存储到数据框中的解决方案。不确定您是否真的想要外部产品,如果您可以发布预期结果会很棒。
np.random.seed(42)
df = pd.DataFrame(np.random.randint(0, 100, size=(5, 1)), columns=['rand_int'])
>>> df
rand_int
0 51
1 92
2 14
3 71
4 60
df['a'] = np.split(np.outer(df['rand_int'], np.arange(5)), 5)
df['b'] = np.split(np.outer(df['rand_int'], np.arange(7)), 5)
>>> df
rand_int a b
0 51 [[0, 51, 102, 153, 204]] [[0, 51, 102, 153, 204, 255, 306]]
1 92 [[0, 92, 184, 276, 368]] [[0, 92, 184, 276, 368, 460, 552]]
2 14 [[0, 14, 28, 42, 56]] [[0, 14, 28, 42, 56, 70, 84]]
3 71 [[0, 71, 142, 213, 284]] [[0, 71, 142, 213, 284, 355, 426]]
4 60 [[0, 60, 120, 180, 240]] [[0, 60, 120, 180, 240, 300, 360]]
df['d'] = df.b.combine(df.a, func=np.setdiff1d)
>>> df['d']
0 [255, 306]
1 [460, 552]
2 [70, 84]
3 [355, 426]
4 [300, 360]
Name: d, dtype: object
请注意,np.split
留下一个额外的维度,不确定是否可以避免。您可能想删除它np.squeeze
>>> df['a'].apply(np.squeeze)
0 [0, 51, 102, 153, 204]
1 [0, 92, 184, 276, 368]
2 [0, 14, 28, 42, 56]
3 [0, 71, 142, 213, 284]
4 [0, 60, 120, 180, 240]
Name: a, dtype: object
推荐阅读
- javascript - Amplify.config 未为所有组件配置应用程序以访问用户池
- java - Java - 在 web.xml 中设置过滤器返回错误子容器在启动期间失败
- systemd - 我在哪里可以找到 systemd 节点导出器指标的列表?
- python - H2O4GPU 和 Scikit-Learn 的分类分数不同
- kubernetes - K8s的秘密组成
- c - 在 c 中的数字序列中查找平均值,同时忽略序列中的负数
- javascript - 如何为如下所示的 JavaScript 库编写 Typescript 定义文件?
- aws-fargate - 是否可以将 AKS 配置为使用 Azure 专用 DNS 区域?
- c# - ServiceStack:AppHost 不支持通过 Singleton 访问当前请求
- javascript - 如何添加数字而不是将它们组合成一个字符串?