Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在对数据框的一列进行装箱后,如何制作一个新的数据框来计算每个箱子中的元素数量?_Python_Pandas_Dataframe_Grouping_Binning - Fatal编程技术网

Python 在对数据框的一列进行装箱后,如何制作一个新的数据框来计算每个箱子中的元素数量?

Python 在对数据框的一列进行装箱后,如何制作一个新的数据框来计算每个箱子中的元素数量?,python,pandas,dataframe,grouping,binning,Python,Pandas,Dataframe,Grouping,Binning,假设我有一个数据帧,df: >>> df Age Score 19 1 20 2 24 3 19 2 24 3 24 1 24 3 20 1 19 1 20 3 22 2 22 1 我想构建一个新的数据框,该数据框将存储箱Age,并将每个存储箱中的元素总数存储在不同的Score列中: Age Score 1 Score 2 Score 3 19-21

假设我有一个数据帧,
df

>>> df

Age    Score
19     1
20     2
24     3
19     2
24     3
24     1
24     3
20     1
19     1
20     3
22     2
22     1
我想构建一个新的数据框,该数据框将存储箱
Age
,并将每个存储箱中的元素总数存储在不同的
Score
列中:

Age       Score 1   Score 2     Score 3
19-21     2         4           3
22-24     2         2           9
这是我做这件事的方式,我觉得它非常复杂(意思是,它不应该这么难):

是否有更好、更清洁、更高效的方法来实现这一目标

cats = ['1', '2', '3']
bins = [0, 1, 2, 3]
data = data[['Age']].join(pd.get_dummies(pd.cut(data.Score, bins, labels=cats)))
data['bins'] = pd.cut(data['Age'], bins=[19,21,24], include_lowest=True)
data.groupby('bins').sum() 

                Age  1  2  3
bins
(18.999, 21.0]  117  3  2  1
(21.0, 24.0]    140  2  1  3

您可以删除/重命名垃圾箱和年龄序列,这需要一些调整才能正确包含这些内容。

我不完全确定您想要什么结果(您是否将计数乘以分数…?),但这可能会有所帮助:

>>> data['age_binned'] = pd.cut(data['Age'], [18,21,24])
>>> data.groupby(['age_binned', 'Score'])['Age'].nunique().unstack()

Score       1  2  3
age_binned         
(18, 21]    2  2  1
(21, 24]    2  1  1

我假设您想要唯一元素的数量,如果您只想要使用.count()而不是.nunique()的元素总数,我想您可以尝试以下方法之一:

1.如果您已经知道垃圾箱:

df['Age'] = np.where(df['Age']<=21,'19-21','22-24')
df.groupby(['Age'])['Score'].value_counts().unstack()
三,。评论中的想法:

pd.crosstab(pd.cut(df.Age, [19, 21, 24],include_lowest=True), df.Score)
这三种方法都会产生以下输出:

Score           1   2   3
Age         
(18.999, 21.0]  3   2   1
(21.0, 24.0]    2   1   3

您可以从以下内容开始:
pd.crosstab(pd.cut(df.Age,[19,21,24]),df.Score)
…您还可以提到如何使用第二种方法使仓位限制整数而不是浮动吗?谢谢。@Kristada673在
pd.cut
中使用
precision=0
df.Age = pd.cut(df.Age, bins=2,include_lowest=True)
df.groupby(['Age'])['Score'].value_counts().unstack()
pd.crosstab(pd.cut(df.Age, [19, 21, 24],include_lowest=True), df.Score)
Score           1   2   3
Age         
(18.999, 21.0]  3   2   1
(21.0, 24.0]    2   1   3