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.
2 odpowiedzi
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)]
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]
Podobne pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.