Изменить значение в функции, используемой пандой groupby - PullRequest
0 голосов
/ 12 февраля 2019

Я делаю следующее:

def percentage(x):
    return x[(x<=5)].count() / x.count() * 100

full_data = full_data.groupby(['Id', 'Week_id'], as_index=False).agg({'Volume': percentage})

Но я хочу сделать это groupby последовательно с несколькими значениями, такими как x<=7, x<=9, x<=11 и т. Д. В функции percentage.

Какой самый простой способ сделать это вместо того, чтобы писать несколько функций и вызывать их?

Так что, в общем, я хочу избегать таких действий:

def percentage_1(x):
    return x[(x<=5)].count() / x.count() * 100

full_data_1 = full_data.groupby(['Id', 'Week_id'], as_index=False).agg({'Volume': percentage_1})

def percentage_2(x):
    return x[(x<=7)].count() / x.count() * 100

full_data_2 = full_data.groupby(['Id', 'Week_id'], as_index=False).agg({'Volume': percentage_2})

# etc.

Ответы [ 2 ]

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

Я придумал это как наиболее краткое решение моего вопроса:

def percentage(x):
    global c
    return x[(x<=c)].count() / x.count() * 100

c=5
full_data_5 = full_data.groupby(['Id', 'Week_id'], as_index=False).agg({'Volume': percentage})

c=7
full_data_7 = full_data.groupby(['Id', 'Week_id'], as_index=False).agg({'Volume': percentage})

c=9
full_data_9 = full_data.groupby(['Id', 'Week_id'], as_index=False).agg({'Volume': percentage})

# etc

Однако я использую глобальную переменную, и это довольно спорная практика.

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

Вы можете переписать свою функцию - создать новый столбец, заполненный логической маской, а затем агрегировать mean и, наконец, умножить на 100 с Series.mul:

n = 3

full_data['new'] = full_data['Volume'] <= n
full_data = full_data.groupby(['Id', 'Week_id'])['new'].mean().mul(100).reset_index()

Решениес функцией:

def per(df, n):
    df['new'] = df['Volume'] <= n
    return df.groupby(['Id', 'Week_id'])['new'].mean().mul(100).reset_index()

РЕДАКТИРОВАТЬ: Решение от GitHub :

full_data = pd.DataFrame({
        'Id':list('XXYYZZXYZX'),
         'Volume':[2,4,8,1,2,5,8,2,6,4],
         'Week_id':list('aaabbbabac')
})

print (full_data)

val = 5
def per(c):
    def f1(x):
        return x[(x<=c)].count() / x.count() * 100
    return f1

full_data2 = full_data.groupby(['Id', 'Week_id']).agg({'Volume': per(val)}).reset_index()
print (full_data2)
  Id Week_id      Volume
0  X       a   66.666667
1  X       c  100.000000
2  Y       a    0.000000
3  Y       b  100.000000
4  Z       a    0.000000
5  Z       b  100.000000

def percentage(x):
    return x[(x<=val)].count() / x.count() * 100

full_data1 = full_data.groupby(['Id', 'Week_id'], as_index=False).agg({'Volume': percentage})

print (full_data1)
  Id Week_id      Volume
0  X       a   66.666667
1  X       c  100.000000
2  Y       a    0.000000
3  Y       b  100.000000
4  Z       a    0.000000
5  Z       b  100.000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...