Как использовать функцию сдвига Python, чтобы увеличить значения ячейки, используя предыдущее значение строки этого конкретного столбца? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть фрейм данных со столбцом 'Y', который имеет логические значения.Я хочу создать новый столбец X, который зависит от значения Y и самого X.Поэтому, если Y - False, я хочу, чтобы значение X было 1, а если Y - True, я хочу, чтобы значение X было значением предыдущих строк X + 1.Мне нужен следующий вывод:

Y     X
False 1
True  2
True  3
False 1
False 1
True  2
True  3

Я пытаюсь сместить функцию df.loc [df ['Y'] == True, 'X'] = df.X.shift (1) +1, ноне получить желаемый результат.Я получаю вывод как

    Y   X
0   False   1.0
1   True    2.0
2   True    2.0
3   False   1.0
4   False   1.0
5   True    2.0
6   True    2.0

Во второй раз, когда Y имеет значение True, он должен увеличить X на 1, используя предыдущее значение X.

я не предпочитаю циклы / итерациитак как у меня есть 5 миллионов строк данных, и итерация займет часы обработки.

df.loc[df['Y']==True,'X'] = df.X.shift(1)+1

columns = ['Y']
index =0,1,2,3,4,5,6
df = pd.DataFrame(index=index, columns=columns)
df['Y'] = True
df.loc[0,'Y']= False
df.loc[3,'Y']= False
df.loc[4,'Y']= False

df.loc[:,'X']=1
df.loc[df['Y']==True,'X'] = df.X.shift(1)+1

1 Ответ

0 голосов
/ 15 февраля 2019

Боюсь, что Shift не может справиться с этим делом, по крайней мере, я пытался много раз.

Здесь предоставим другой способ справиться с этим.

## your codes about initializing df

import pandas as pd
import numpy as np

columns = ['Y']
index = 0, 1, 2, 3, 4, 5, 6
df = pd.DataFrame(index=index, columns=columns)
df['Y'] = True
df.loc[0, 'Y'] = False
df.loc[3, 'Y'] = False
df.loc[4, 'Y'] = False

df.loc[:, 'X'] = 1

print(df)

### initializing of df ends here

### my codes start here


# create an assist column holding the cumsum of X column
df['cum'] = df.X.cumsum()

# calculate the offset
df['offset'] = df.apply(lambda s: 0 - s.cum if s.Y is False else np.nan, axis=1).fillna(method='ffill') + 1

# modify the X column by cumsum and calculated offset
df['X'] = df['cum'] + df['offset']

df.X = df.X.astype(int)
# remove assist columns leaving only the Y, X column
df = df[['Y', 'X']]

print(df)

Результат выглядит так,и я думаю, что это то, чего вы очень хотели, и потому что он использует панды для вычисления, он не будет таким медленным, как цикл for в чистых кодах Python:

       Y  X
0  False  1
1   True  1
2   True  1
3  False  1
4  False  1
5   True  1
6   True  1

       Y  X
0  False  1
1   True  2
2   True  3
3  False  1
4  False  1
5   True  2
6   True  3

Вы можете проверить более подробно о том, чтофрейм данных выглядит следующим образом: print (df) до удаления этих двух столбцов (cum, offset).

Расчет столбца cum, offset:

       Y  X  cum  offset
0  False  1    1     0.0
1   True  1    2     0.0
2   True  1    3     0.0
3  False  1    4    -3.0
4  False  1    5    -4.0
5   True  1    6    -4.0
6   True  1    7    -4.0

Обновление столбца X:

       Y    X  cum  offset
0  False  1.0    1     0.0
1   True  2.0    2     0.0
2   True  3.0    3     0.0
3  False  1.0    4    -3.0
4  False  1.0    5    -4.0
5   True  2.0    6    -4.0
6   True  3.0    7    -4.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...