Python Pandas: преобразовать вывод.value_counts в dataframe
Привет, я хочу получить подсчет уникальных значений фрейма данных. count_values реализует это, но я хочу использовать его выход где-то в другом месте. Как я могу преобразовать вывод.count_values в кадр данных pandas. вот пример кода:
import pandas as pd
df = pd.DataFrame({'a':[1, 1, 2, 2, 2]})
value_counts = df['a'].value_counts(dropna=True, sort=True)
print(value_counts)
print(type(value_counts))
выход:
2 3
1 2
Name: a, dtype: int64
<class 'pandas.core.series.Series'>
Что мне нужно, так это dataframe:
unique_values counts
2 3
1 2
Спасибо.
Ответы
Ответ 1
Используйте rename_axis
для имени столбца из индекса и reset_index
:
df = value_counts.rename_axis('unique_values').reset_index(name='counts')
print (df)
unique_values counts
0 2 3
1 1 2
Или, если нужен один столбец DataFrame, используйте Series.to_frame
:
df = value_counts.rename_axis('unique_values').to_frame('counts')
print (df)
counts
unique_values
2 3
1 2
Ответ 2
Я просто столкнулся с той же проблемой, поэтому я изложил свои мысли здесь.
Предупреждение
Когда вы имеете дело со структурой данных Pandas
, вы должны знать тип возвращаемого значения.
Другое решение здесь
Как и @jezrael, упомянутый ранее, Pandas
предоставляет API pd.Series.to_frame
.
Шаг 1
Вы также можете обернуть pd.Series
в pd.DataFrame
, просто выполнив
df_val_counts = pd.DataFrame(value_counts) # wrap pd.Series to pd.DataFrame
Затем у вас есть pd.DataFrame
с именем столбца 'a'
, и ваш первый столбец становится индексом.
Input: print(df_value_counts.index.values)
Output: [2 1]
Input: print(df_value_counts.columns)
Output: Index(['a'], dtype='object')
Шаг 2
Что теперь?
Если вы хотите добавить новые имена столбцов в качестве pd.DataFrame
, вы можете просто сбросить индекс с помощью API reset_index().
Затем измените имя столбца списком с помощью API df.coloumns.
df_value_counts = df_value_counts.reset_index()
df_value_counts.columns = ['unique_values', 'counts']
Тогда вы получили то, что вам нужно
Output:
unique_values counts
0 2 3
1 1 2
Полный ответ здесь
import pandas as pd
df = pd.DataFrame({'a':[1, 1, 2, 2, 2]})
value_counts = df['a'].value_counts(dropna=True, sort=True)
# solution here
df_val_counts = pd.DataFrame(value_counts)
df_value_counts = df_value_counts.reset_index()
df_value_counts.columns = ['unique_values', 'counts'] # change column names
Ответ 3
Я тоже добавлю в шапку, по сути, то же самое, что и решение @wy-hsu, но в формате функции:
def value_counts_df(df, col):
"""
Returns pd.value_counts() as a DataFrame
Parameters
----------
df : Pandas Dataframe
Dataframe on which to run value_counts(), must have column 'col'.
col : str
Name of column in 'df' for which to generate counts
Returns
-------
Pandas Dataframe
Returned dataframe will have a single column named "count" which contains the count_values()
for each unique value of df[col]. The index name of this dataframe is 'col'.
Example
-------
>>> value_counts_df(pd.DataFrame({'a':[1, 1, 2, 2, 2]}), 'a')
count
a
2 3
1 2
"""
df = pd.DataFrame(df[col].value_counts())
df.index.name = col
df.columns = ['count']
return df