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

У меня есть вопрос по обработке данных, который, я надеюсь, кто-то может помочь.

У меня есть два столбца в кадре данных:

A               B
111            5.2
EF             5.6
DG             5.1
LK             5.4
111            5
EF             5.2

Я хочу создать третий столбец C, где каждый раз111 показан в столбце a, я хочу взять разницу от 5 до столбца B, пока не будет показан следующий 111.

Таким образом, это будет выглядеть так

A               B            C
111            5.2         5 (minus 0.2)
EF             5.6         5.4 (minus 0.2)
DG             5.1         4.9 (minus 0.2
LK             5.4         5.2 (minus 0.2)
111            5            5 (no change needed as already 5)
EF             5.2          5.2 (no change needed as previous 111 already 5)

Так что, если 111в столбце A значение в столбце B равно 5.2, тогда (5-5.2 = -0.2) Следовательно, C = 5.2 + -0.2 = 5 Если 111 в столбце A имеет значение в столбце B, равное 4.8, то (5-4.8 = 0.2)Поэтому C = 4.8 + 0.2 = 5 и т. Д., Пока не будет найден следующий 111.

Надеюсь, это имеет смысл.По сути, 111 - это стандарт, который должен быть 5. Если это не 5, тогда я хочу применить разницу ко всем значениям в строке B, пока не будет найден новый 111.Любые предложения по этому поводу?

Ответы [ 3 ]

3 голосов
/ 29 апреля 2019

Я использую transform после создания групповой клавиши с cumsum

df['C']=df.B-(df.groupby(df.A.eq('111').cumsum()).B.transform('first')-5)
df
Out[662]: 
     A    B    C
0  111  5.2  5.0
1   EF  5.6  5.4
2   DG  5.1  4.9
3   LK  5.4  5.2
4  111  5.0  5.0
5   EF  5.2  5.2
1 голос
/ 29 апреля 2019

вы должны просто иметь возможность использовать np.where и ffill

df['C'] = np.where(df['A'] == '111', 5 - df['B'], np.nan)
df['C'] = df['C'].ffill()
df['C'] = df['B'] - abs(df['C'])


     A    B    C
0  111  5.2  5.0
1   EF  5.6  5.4
2   DG  5.1  4.9
3   LK  5.4  5.2
4  111  5.0  5.0
5   EF  5.2  5.2
0 голосов
/ 29 апреля 2019

Это очень особенный вопрос, поэтому ответ не очень общий.В других случаях, вероятно, имеет смысл использовать функцию apply .Однако здесь это просто:

df = pd.DataFrame(columns=['A', 'B'])
df.A = [111, 'EF', 'DG', 'LK', 111, 'EF']
df.B = [5.2, 5.6, 5.1, 5.4, 5, 5.2]

diff = 0
df['C'] = np.nan
for i in range(len(df)):
    if df.A[i] == 111:
        diff = 5 - df.B[i]
    df.loc[i, 'C'] = df.B[i] + diff
print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...