首页 > 解决方案 > 如何在 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 数组的问题:

  1. 如何将 df 中的 array_a 和 array_b 列定义为 rand_int 列中第 n 行中的项目之间的乘积?
  2. 是否可以创建另一列,让我们将其array_diff命名为每行的 array_a 和 array_b 之间的 np.setdiff1d?

标签: pythonpandasnumpy

解决方案


我会说最好使用 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

推荐阅读