Как работать с массивами Numpy в Pandas DataFrames - PullRequest
0 голосов
/ 02 июля 2018

Давайте предположим, что у каждого есть 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])

Некоторые вопросы, которые могут помочь мне понять, как управлять массивами Numpy с помощью Pandas DataFrames:

  1. Как можно определить столбцы array_a и array_b в df как произведение между элементом в n-й строке столбца rand_int?
  2. Можно ли создать еще один столбец, назовем его array_diff, который представляет собой np.setdiff1d между массивами _a и array_b для каждой строки?

1 Ответ

0 голосов
/ 02 июля 2018

Я бы сказал, что лучше работать с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...