1 回答
TA贡献1831条经验 获得超4个赞
计算数据帧中每个值的出现次数,将频率范围以 10 为一组进行分组,然后为每个范围创建
dict
一个DataFrames
。垃圾箱标签将成为
dict
钥匙该
bins
列是分类的,因此.groupby
将为每个标签创建一个组,即使该组为空,因此使用pandas.DataFrame.empty
,因此只有非空组才会添加到dict
of 中DataFrames
。替换
g: dfg
为中g: pd.DataFrame(dfg.B)
只有列。B
dict
使用
dfg.reset_index(drop=True)
或pd.DataFrame(dfg.B).reset_index(drop=True)
删除原始索引。labels
使用,因为它们更容易用作dict
密钥如果不使用
labels
,dict
键将是Interval
, 就像[Interval(10, 20, closed='right')
,这很麻烦。df.B.map(df.groupby('B')['B'].count())
也有效,但不是必需的。
使用
pandas.Series.value_counts()
和pandas.Series.map
在 中创建一个计数列df
,它将传达列中值的频率B
。用于
pd.cut
对频率范围进行分类pandas.DataFrame.groupby
与 a 一起使用可根据 bin 标签dict-comprehension
创建dict
of 。DataFrames
import pandas as pd
import numpy as np
# setup test dataframe
np.random.seed(365)
df = pd.DataFrame({'B': np.random.randint(5238, size=(200000))})
# add a counts column to the dataframe
df['counts'] = df.B.map(df.B.value_counts())
# create a bins column for the frequency range
bins = range(0, 201, 10)
labels = range(10, 201, 10)
df['bins'] = pd.cut(df.counts, bins=bins, right=True, labels=labels)
# display(df.head())
B counts bins
0 2740 37 40
1 4897 41 50
2 4955 45 50
3 428 31 40
4 226 34 40
# create a dict of dataframes for the non-empty bins
dfd = {g: dfg for g, dfg in df.groupby('bins') if not dfg.empty}
# print dict keys
dfd.keys()
[out]:
dict_keys([20, 30, 40, 50, 60, 70])
# display(dfd[20].head())
B counts bins
5350 4986 19 20
5646 4952 20 20
11232 3728 19 20
11707 2819 20 20
13547 3728 19 20
添加回答
举报