Установите Pandas Столбец в NumPy Массив - PullRequest
1 голос
/ 11 марта 2020

Допустим, у меня есть NumPy Array:

x = np.array([0, 1, 1, 3, 4, 0, 5, 2, 2, 1])

и Pandas DataFrame:

df = pd.DataFrame({'start': [2, 5, 1, 0, 0], 'stop': [6, 9, 4, 3, 2]})

#    start  stop
# 0      2     6
# 1      5     9
# 2      1     4
# 3      0     3
# 4      0     2

Столбцы start и stop соответствуют индексы запуска и остановки из массива NumPy x. Итак, я хотел бы добавить третий столбец в DataFrame, который представляет последовательность (объект) из x. Я могу выполнить sh, используя iterrows:

df['sequence'] = [[] for _ in range(len(df))]
for idx, row in df.iterrows():
    df.at[idx, 'sequence'] = x[row['start']:row['stop']]

#    start  stop      sequence
# 0      2     6  [1, 3, 4, 0]
# 1      5     9  [0, 5, 2, 2]
# 2      1     4     [1, 1, 3]
# 3      0     3     [0, 1, 1]
# 4      0     2        [0, 1]

Однако для DataFrame с миллионами строк iterrows становится нежелательным. Мне нужно быстрое решение, не требующее тонны памяти.

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Вы можете сделать это так.

>>> x = np.array([0, 1, 1, 3, 4, 0, 5, 2, 2, 1])
>>> df = pd.DataFrame({'start': [2, 5, 1, 0, 0], 'stop': [6, 9, 4, 3, 2]})
>>> df['sequence'] = [x[df['start'][idx]:df['stop'][idx]] for idx in range(len(df))]
>>> df

#   start  stop      sequence
# 0      2     6  [1, 3, 4, 0]
# 1      5     9  [0, 5, 2, 2]
# 2      1     4     [1, 1, 3]
# 3      0     3     [0, 1, 1]
# 4      0     2        [0, 1]
0 голосов
/ 11 марта 2020

Как насчет того, чтобы мы не делали iterrows с zip и для l oop

[x[s:t]for s , t in zip(df.start,df.stop)]
[array([1, 3, 4, 0]), array([0, 5, 2, 2]), array([1, 1, 3]), array([0, 1, 1]), array([0, 1])]
#df['sequence'] = [x[s:t]for s , t in zip(df.start,df.stop)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...