pandas dataframe: как агрегировать подмножество строк на основе значения столбца - PullRequest
6 голосов
/ 17 апреля 2019

У меня есть структура данных pandas, структурированная так:

      value
lab        
A        50
B        35
C         8
D         5
E         1
F         1

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

df = pd.DataFrame({'lab':['A', 'B', 'C', 'D', 'E', 'F'], 'value':[50, 35, 8, 5, 1, 1]})
df = df.set_index('lab')

Я хотел бы объединить строки, значение которых меньше заданного порога: все эти строки должны быть заменены одной строкой, значение которой является суммой замещенных строк.

Например, если я выберу порог = 6, ожидаемый результат должен быть следующим:

      value
lab        
A        50
B        35
C         8
X         7 #sum of D, E, F

Как я могу это сделать?

Я думал использовать groupby(), но все примеры, которые я видел, включали использование отдельного столбца для группировки, поэтому я не знаю, как использовать его в этом случае.
Я могу выбрать строки меньше моего порога с помощью loc,делая df.loc[df['value'] < threshold], но я не знаю, как суммировать только эти строки и оставить остальную часть кадра без изменений.

Ответы [ 2 ]

7 голосов
/ 17 апреля 2019

Вы можете использовать lambda и DataFrame.append, чтобы добиться этого в однострочном режиме:

thresh = 6

(df[lambda x: x['value'] >= thresh]
 .append(df[lambda x: x['value'] < thresh].sum().rename('X')))

Или, если хотите,

mask = df['value'].ge(thresh)

df[mask].append(df[~mask].sum().rename('X'))

[out]

     value
lab       
A       50
B       35
C        8
X        7
5 голосов
/ 17 апреля 2019

Использовать параметр с увеличением с фильтром DataFrame:

threshold = 6
m = df['value'] < threshold
df1 = df[~m].copy()
df1.loc['Z'] = df.loc[m, 'value'].sum()

print (df1)
     value
lab       
A       50
B       35
C        8
Z        7

Другое решение:

m = df['value'] < threshold
df1 = df[~m].append(df.loc[m, ['value']].sum().rename('Z'))
print (df1)
     value
lab       
A       50
B       35
C        8
Z        7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...