pandas value_counts (показывает значения и соотношение)

#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