Python3 .7 Pandas1.0.1 Dataframe - Рассчитать сумму столбца в диапазоне и перегруппировать в одну новую строку? - PullRequest
2 голосов
/ 17 марта 2020

Мой первый вопрос по StackOverflow. Пожалуйста, будьте добры ко мне:)

Здравствуйте, я только начал небольшой проект по науке о данных и хотел в конечном итоге создать график ap ie через matplot, показывающий процент модели устройства в общем трафике сайта c (т. е. 30% iPhone, 20% iPad, 10% Ma c, et c.).

useragent count
iPhone    11298
Mac        3206
iPad        627
SM-N960F    433
SM-N950F    430
...         ...
K330          1
K220          1
SM-J737P      1
SM-J737T1     1
0PFJ50        1
[1991 rows x 2 columns]

На скриншоте 1,991 записей. Я готовлю данные для построения графика и хочу отображать только первые 5 пользовательских агентов (первые 4 - это устройства, а первые 5 будут помечены как другие и сумма оставшихся элементов).

Ожидаемый результат это так:

useragent count
iPhone    11298
Mac        3206
iPad        627
SM-N960F    433
Others     9000

Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Использование:

#first sorting data if necessary
df1 = df.sort_values('count', ascending=False)

#then get top 4 rows
df2 = df1.head(4)
#filter column `count` for all values after 4 rows
summed = df1.loc[df1.index[4:], 'count'].sum()

#create DataFrame by another counts
df3 = pd.DataFrame({'useragent':['Other'], 'count':[summed]})

#join together
df4 = pd.concat([df2, df3], sort=False, ignore_index=True)
print (df4)
  useragent  count
0    iPhone  11298
1       Mac   3206
2      iPad    627
3  SM-N960F    433
4     Other    435

РЕДАКТИРОВАТЬ:

#filter by threshold
mask = df['count'] > 500
#filtered rows by boolean indexing
df2 = df[mask]
#inverted mask - sum by count
summed = df.loc[~mask, 'count'].sum()
#same like above
df3 = pd.DataFrame({'useragent':['Other'], 'count':[summed]})

df5 = pd.concat([df2, df3], sort=False, ignore_index=True)
print (df5)
  useragent  count
0    iPhone  11298
1       Mac   3206
2      iPad    627
3     Other    868
0 голосов
/ 17 марта 2020

Вы можете попробовать что-то вроде:

# sort dataframe
df.sort_values(by=['count'], inplace=True)
# recreate the index of your rows to make sure that 0 corresponds to the one with the higher count
df.reset_index(drop=True, inplace=True)
# add your new row to your dataset
df.append({'useragent': 'Others', 'count': df.loc[5:]['count'].cumsum()}, inplace=True)
# drop the rows you don't need anymore
df.drop([5:len(df.index.values.tolist())-1], inplace=True)

Хотя я не совсем уверен, но стоит попробовать. Я надеюсь, что это даст вам некоторые идеи.

...