#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
Как новичок в pandas, я хочу получить количество значений из определенного столбца и процентное количество в одном кадре. Я могу получить одно или другое, но не могу понять, как добавить или объединить их в один кадр. Мысли?
Фрейм / таблица должны быть такими:
some_value, count, count(as %)
Вот что у меня есть…
import numpy as np
import pandas as pd
np.random.seed(1)
values = np.random.randint(30, 35, 20)
df1 = pd.DataFrame(values, columns=['some_value'])
df1.sort_values(by=['some_value'], inplace = True)
df2 = df1.value_counts()
df3 = df1.value_counts(normalize=True)
print(df2)
print("------")
print(df3)
Ответ №1:
Просто используйте
pd.DataFrame({"count":df2,"%":df3*100})
чтобы поместить ряд в один df.
Вывод:
count %
some_value
34 7 35.0
32 4 20.0
33 3 15.0
31 3 15.0
30 3 15.0
Ответ №2:
Попробуйте это с помощью partial
from functools
с pd.DataFrame.agg
вызовом списка функций:
from functools import partial
vc_norm = partial(pd.Series.value_counts, normalize=True)
df1['some_value'].agg([pd.Series.value_counts, vc_norm])
Вывод:
value_counts value_counts
34 7 0.35
32 4 0.20
31 3 0.15
30 3 0.15
33 3 0.15
Или вы можете использовать лямбда-функцию следующим образом:
df1['some_value'].agg([pd.Series.value_counts, lambda x: x.value_counts(normalize=True)])
Ответ №3:
Я думаю, что вызов value_counts
, а затем нормализация его с помощью лямбда-функции может быть более эффективным, но вы можете получить желаемый результат, выполнив :
df1_counts = df1.value_counts().to_frame(name="count").merge(
df1.value_counts(normalize=True).to_frame(name="count(as %)"),
left_index=True,
right_index=True,
)
В результате :
| some_value | count | count(as %) |
|------------|-------|-------------|
| 34 | 7 | 0.35 |
| 32 | 4 | 0.20 |
| 33 | 3 | 0.15 |
| 31 | 3 | 0.15 |
| 30 | 3 | 0.15 |
Лучший!
Ответ №4:
Вычисляйте, переименовывайте и объединяйте. Давайте попробуем;
df1.some_value.value_counts().to_frame('count').join(df1.some_value.value_counts(normalize=True).to_frame('%'))
count %
34 7 0.35
32 4 0.20
33 3 0.15
31 3 0.15
30 3 0.15