Как передать текущую группу в качестве аргумента в groupby? - PullRequest
0 голосов
/ 30 сентября 2018

Рассмотрим этот пример

df = pd.DataFrame({'group' : ['a','a','a','b','b'],
                   'value' : [1,2,3,10,20]})

Out[39]: 
  group  value
0     a      1
1     a      2
2     a      3
3     b     10
4     b     20

По сути, я хотел бы сгруппировать по group и иметь возможность вызвать function, который использует значение текущей группы (a или bв этом примере) в качестве аргумента.То есть моя функция принимает в качестве входных данных текущий value и соответствующие ему group.

Что-то вроде

def myfunc(mygroup, myvalue):
    return myvalue.astype(str) + mygroup

df.groupby('group').value.apply(lambda x: myfunc(mygroup,x))

, что не работает.Ожидаемый результат:

Out[38]: 
0     1a
1     2a
2     3a
3    10b
4    20b

Есть идеи?Спасибо!

Ответы [ 4 ]

0 голосов
/ 30 сентября 2018

Чтобы получить точный вывод по вашему желанию, изменив код:

def myfunc(mydf):
    return mydf.value.astype(str)+mydf.group

df.groupby('group').apply(myfunc).reset_index(level=0, drop=True)

Дополнительная заметка может ответить на ваше любопытство.

SeriesGroupBy

Выполнение df.groupby('group').value приведет к объекту SeriesGroupBy столбца value, сгруппированному по столбцу group, поэтому при вызове .apply в коде он ожидал Series (столбец value)) в качестве аргумента вашей функции.

df.groupby('group').value.apply(lambda x: x.astype(str)+group))
# x is Series of column 'value'. This will raise error, since 'group' isn't recognized`

df.groupby('group').value.apply(lambda x: x.astype(str)+df.group))
# use dataframe 'df' to access column 'group'

DataFrameGroupBy

С другой стороны, выполнение df.groupby('group') приведет к объекту DataFrameGroupBy, так чтовызов .apply будет ожидать Dataframe в качестве аргумента вашей функции.Следовательно, вы можете получить доступ ко всем столбцам, например:

df.groupby('group').apply(lambda x: x.value.astype(str)+x.group)
# here x is a dataframe, it can access all columns.
0 голосов
/ 30 сентября 2018
df.groupby(level=0).apply(lambda x:x['value'].astype(str)+ x['group'])
0 голосов
/ 30 сентября 2018

Вам не нужна никакая функция group, если у вас уже есть использование столбца группы:

df['value'].astype(str)+df['group']

0     1a
1     2a
2     3a
3    10b
4    20b
dtype: object
0 голосов
/ 30 сентября 2018

Вы можете попробовать сгруппировать фрейм данных и добавить определенные столбцы в функцию группировки

df.groupby(['group']).apply(lambda x: x['value'].astype(str) + x['group'])

Out:

group   
a      0     1a
       1     2a
       2     3a
b      3    10b
       4    20b
dtype: object

или

Вы также можете попробовать зациклить группы по отдельности и добавить группу к значению

pd.concat([g['value'].astype(str)+i for i,g in df.groupby(['group'])])

Out:

0     1a
1     2a
2     3a
3    10b
4    20b
Name: value, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...