如何在Pandas DataFrames中管理Numpy数组

时间:2018-07-02 07:10:52

标签: python pandas 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?

1 个答案:

答案 0 :(得分:1)

我想最好与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