быстро перебирать строки в большом фрейме данных, чтобы определить содержимое столбца - PullRequest
1 голос
/ 17 апреля 2019

Для следующего фрейма данных:

import numpy as np
import pandas as pd
df = pd.DataFrame({'chr_key':  [1, 1, 1, 2, 2, 3, 4],
                   'position': [123,124,125,126,127,128,129],
                   'hit_count': [20,19,18,17,16,15,14]})

df['strand'] = np.nan

Я хочу изменить столбец strand так, чтобы:

for i in range(0, len(df['position'])):
    if df['chr_key'][i] == df['chr_key'][i+1] and df['hit_count'][i] >= df['hit_count'][i+1]:
        df['strand'][i] = 'F'

    else:
        df['strand'][i] = 'R'

Мой фактический df был> 100k строк, поэтомуцикл for медленный, как можно себе представить.Есть ли быстрый способ добиться этого?

Я изменил свой исходный кадр данных.Вывод будет:

df = pd.DataFrame({'chr_key' : [1, 1, 1, 2, 2, 3, 4], 'position' : [123, 124, 125, 126, 127, 128, 129], 'hit_count' : [20, 19, 18, 17, 16, 15, 14], 'strand': ['R', 'R', 'F', 'R', 'F', 'F', 'F']})

, поскольку их всего 3 chr_key == 1, поэтому, когда дело доходит до третьей строки, поскольку в ней нет строки сравнения i + 1, значение strand по умолчанию будет равноF

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Вы можете попробовать это:

import pandas as pd

df = pd.DataFrame({'chr_key' : [1, 1, 1, 2, 2, 3, 4], 'position' : [123, 124, 125, 126, 127, 128, 129], 'hit_count' : [20, 19, 18, 17, 16, 15, 14]})

df['strand'] = 'R'

idx_1 = df.chr_key == df.chr_key.shift(-1) 
idx_2 = df.hit_count >= df.hit_count.shift(-1)

df.loc[idx_1 & idx_2, 'strand'] = 'F'

Использование методов loc или iloc для доступа к пандам - ​​это лучший способ: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html

1 голос
/ 17 апреля 2019

Я использую np.where и shift

c1=(df.chr_key==df.chr_key.shift(-1))
c2=(df.hit_count>=df.hit_count.shift(-1))
df['strand']=np.where(c1&c2,'F','R')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...