Применить функцию процесса к группам в кадре данных - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть фрейм данных, например:

df_1 = pd.DataFrame({'X' : ['A','A','A','A','B','B','B'],
                     'Y' : [1,   0,  1,  1,  0,  0,'Nan']})

Я бы хотел сгруппировать его по X и создать столбец Z:

df_2 = pd.DataFrame({'X' : ['A','B'],
                     'Z' : [0.5, 0.5]})

Но описать сложноЯ хотел бы применить эту функцию:

def fun(Y,Z):
    if Y == 1:
        Z = Z + 1
    elif Y == 0:
        Z = Z - 1

Итак, первый Y в df_1 - это 1, то есть в группе A, поэтому Z для группы A увеличивается до 1,5.Затем следующий равен 0, поэтому он возвращается к 0,5, затем есть еще 2 единицы, поэтому он заканчивается на 2,5.

Что даст мне:

X   Z
A   2.5
B   -1.5

1 Ответ

2 голосов
/ 26 апреля 2019

Вы можете изменить свой первый DataFrame и использовать sum с выравниванием индекса.

  • 0 -> -1 (вычтите 1, когда ноль найден)
  • NaN --> 0 (без измененийкогда NaN найден

u = df_1.assign(Z=df_1.Y.replace({0: -1, np.nan: 0})).groupby('X')['Z'].sum().to_frame()

df_2.set_index('X') + u

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