Pandas .diff () для определенных c строк - PullRequest
1 голос
/ 19 июня 2020

Я встречал много похожих вопросов, но ни один из них не решает мою проблему.

У меня очень большой набор данных, в котором я хочу найти разницу только для нескольких выбранных строк из предыдущей строки. В следующем примере я хотел бы получить diff () для pVal на основе значения в cal c, как показано:

     pVal        calc        pDiff
1    .17         False       NaN
2    .31         False       NaN
3    .46         False       NaN
4    .39         True       -.07
5    .26         False       NaN
6    .6          True       .34

Примечание: pDiff получает NaN по умолчанию

Можно просто вычислить разницу для всех строк, а затем заменить pDiff на NaN на False в «cal c». Но, как указывалось ранее, у меня очень большой набор данных с очень небольшим количеством «True» значений в столбце cal c, поэтому много накладных расходов.

Я пробовал следующее:

df['pDiff'] = df[df['calc']==True]['pVal'].diff()

Но он дает неверные результаты, вычисляя разницу между строками с помощью calc == True. В нашем примере разница для строки 6 вычисляется между строками 6 и 4 (0,6–0,39 = 0,21) вместо ожидаемых 0,34 между строками 6 и 5. Разница для строки 4 остается NaN, которая является первой строкой с calc == True.

У меня есть возможность перебирать все строки, но для меня это слишком медленно.

Мне нужно решение, которое вычисляет и изменяет значения только для тех строк, где cal c содержит True .

Ответы [ 3 ]

0 голосов
/ 19 июня 2020

np.where + shift отлично подходят для сравнения предыдущей или следующей строки в зависимости от условий :)

df['pDiff'] = np.where((df['calc'] == True), df['pVal'] - df['pVal'].shift(), np.nan)
0 голосов
/ 19 июня 2020

Выполнить: df['pDiff'] = np.where(df.calc, df.pVal.diff(), np.nan).

df.pVal.diff() - источник данных, а np.where - фильтр. df.calc - это условие, а np.nan - «другое» значение.

0 голосов
/ 19 июня 2020

Попробуйте,

df['shifted'] = df.calc.shift()
df1 = df[(df.calc == True) | (df.shifted == True)]
df1.pdidff = df1.pVal.diff()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...