Вот моя проблема:
У меня есть 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.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')]
вы всегда можете перебирать данные и применять условные обозначения. Это, вероятно, не лучшее решение, но это должно работать:
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']
надеюсь это поможет