Powiedzmy, że mam tablicę NumPy:

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

I 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

Kolumny start i stop odpowiadają indeksom początkowym i końcowym z tablicy NumPy x. Tak więc chciałbym dodać trzecią kolumnę do DataFrame, która reprezentuje sekwencję (obiekt) z x. Mogę to zrobić za pomocą 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]

Jednak dla DataFrame z milionami wierszy iterrows staje się niepożądane. Potrzebuję rozwiązania, które jest zarówno szybkie, jak i niewymagające dużej ilości pamięci.

1
slaw 11 marzec 2020, 04:33

2 odpowiedzi

Najlepsza odpowiedź

Co powiesz na to, że nie zrobimy iterows z zip i pętlą for

[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)]
0
BENY 11 marzec 2020, 01:40

Możesz to zrobić.

>>> 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
Byron 11 marzec 2020, 02:12