Панды сгруппированы по числовому условию

1

Вот моя проблема:

У меня есть dataframe на этой форме:

name number 

A     2

B     10

C     25

D     35

E     45

F     55

и я хочу сгруппировать имя по числовому условию. Более подробно я хочу сгруппировать по интервалу:

[0,15), [15,40), [40,+inf)

поэтому я хочу, чтобы группа

(A, B), (C, D), (E,F)

Знаете ли вы, можно ли это получить? благодарю вас

Теги:
pandas
pandas-groupby

2 ответа

0
Лучший ответ

Используйте pandas.cut для нового столбца или Series:

df['bins'] = pd.cut(df['number'], bins=[0,15,40, np.inf], right=False, include_lowest=True)
print (df)
  name  number          bins
0    A       2   [0.0, 15.0)
1    B      10   [0.0, 15.0)
2    C      25  [15.0, 40.0)
3    D      35  [15.0, 40.0)
4    E      45   [40.0, inf)
5    F      55   [40.0, inf)

s = pd.cut(df['number'], bins=[0,15,40, np.inf], right=False, include_lowest=True)

А затем используйте groupby с агрегацией, например:

df1 = df.groupby('bins').sum()
print (df1)

bins                
[0.0, 15.0)       12
[15.0, 40.0)      60
[40.0, inf)      100

Или используйте Series:

df1 = df.groupby(s).sum()

Если хотите кортежи:

s = pd.cut(df['number'], bins=[0,15,40, np.inf], right=False, include_lowest=True)

out = [tuple(x) for x in df.groupby(s)['name'].apply(list)]
print (out)
[('A', 'B'), ('C', 'D'), ('E', 'F')]
  • 0
    спасибо я попробую
0

вы всегда можете перебирать данные и применять условные обозначения. Это, вероятно, не лучшее решение, но это должно работать:

list1 = []
list2 = []
list3 = []
for i in range(df.shape[0]):
    if df['number'][i] < 15:
        list1.append['name']
    if df['number'][i] >= 15 & df['number'][i] < 40:
        list2.append['name']
    if df['number'][i] > 15:
        list3.append['name']

надеюсь это поможет

Ещё вопросы

Сообщество Overcoder
Наверх
Меню