Как сместить элементы столбца панды для данного индекса на основе условия? - PullRequest
0 голосов
/ 29 марта 2019

Я недавно начал использовать питона и панд, пожалуйста, помните об этом. У меня есть два столбца (A, B) данных (dataframe), которые должны быть расположены в определенной последовательности на основе определенного отношения между двумя столбцами (скажем, элементы столбца A должны быть меньше, чем элементы столбца B для данного индекса), если отношение не удовлетворены данные должны быть сдвинуты (только для A) на строку, начиная с индекса, где условие не выполняется по всей длине столбца. И его следует заменить на NaN, если условие не выполняется.

Я попробовал функцию shift (1). Это работает, только если первый элемент не соответствует условию, но если есть какой-либо другой элемент или несколько элементов не соответствуют критериям, он создает несколько NaN в начале столбца A, а не в том месте, где критерии не выполняются.

mdata1 = [[3,2],[5,4],[8,6],[10,7],[float('NaN'),9],[float('NaN'),11]]
mdf1 = pd.DataFrame(mdata1,columns=['A','B'])

for xt in range (0,len(mdf1)):
    if mdf1.A[xt]>mdf1.B[xt]:
        mdf1['A'] = mdf1['A'].shift(1)

Фактический результат

A   B
NaN 2
NaN 4
3.0 6
5.0 7
8.0 9
10.0    11

Ожидаемый результат

A   B
NaN 2
3.0 4
5.0 6
NaN 7
8.0 9
10.0    11

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

Я бы сделал merge_asof из исходного столбца В кадра данных в кадр данных, содержащий только значения, отличные от NaN, из столбца А. Удаление дубликатов в новом столбце даст ожидаемый результат:

tmp = pd.merge_asof(mdf1, pd.DataFrame(mdf1.A.dropna().astype(np.int64)),
                    left_on='B', right_on='A', suffixes=('_x', ''))['A']

mdf1['A'] = np.where(tmp.duplicated(), np.nan, tmp)
0 голосов
/ 29 марта 2019

Я не понимаю, что именно вы хотите сделать. но просто изменяя ваш код, я получаю ожидаемые результаты:

for xt in range (0,len(mdf1)):
if mdf1.A[xt]>mdf1.B[xt]:
    mdf1.loc[xt:,'A'] = mdf1[xt:]['A'].shift(1)

shift (1) смещает весь столбец / фрейм данных на одну строку, поэтому вам нужно начать смещение с индекса, на который вы нацелены, чтобы получить то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...