我不明白为什么在同一数据帧上调用apply和transform时返回不同的数据类型。我之前解释了这两个函数的方式,沿用了“应用程序>代码>折叠数据,并且转换 >与应用完全相同,但保留原始索引并不会崩溃。
数据帧({‘id’:[1,1,1,2,2,2,2,2,3,4],
“猫”:[1,1,0,0,1,0,0,0,0,1]})
让我们识别那些在cat列中具有非零条目的ids
>&燃气轮机&燃气轮机;df.groupby('id')['cat'].apply(lambda x:(x==1.any())
身份证件
1正确
2正确
3错误
4正确
名称:cat,数据类型:bool
太好了。但是,如果我们想创建一个指示符列,我们可以执行以下操作
>&燃气轮机&燃气轮机;groupby('id')['cat'].transform(lambda x:(x==1).any())
0 1
1 1
2 1
3 1
4 1
5 1
6 1
7 0
8 0
9 1
名称:cat,数据类型:int64
我不明白为什么数据类型现在是int64,而不是any()函数返回的布尔值
当我将原始数据帧更改为包含一些布尔值(请注意,零仍然存在)时,转换方法将在对象列中返回布尔值。这对我来说是一个额外的谜,因为所有的值都是布尔值,但它被列为object,显然是为了匹配原始整数和布尔混合类型列的dtype
数据帧({‘id’:[1,1,1,2,2,2,2,2,3,4],
‘cat’:[True,True,0,0,True,0,0,0,True]}
&燃气轮机&燃气轮机&燃气轮机;groupby(’id’)[‘cat’].transform(lambda x:(x==1).any())
0对
1正确
2正确
3正确
4正确
5对
6正确
7错误
8错误
9正确
名称:cat,数据类型:object
但是,当我使用所有布尔值时,transform函数返回一个布尔值列
数据帧({‘id’:[1,1,1,2,2,2,2,2,3,4],
“猫”:[真,真,假,假,真,假,假,假,假,真])
&燃气轮机&燃气轮机&燃气轮机;groupby(’id’)[‘cat’].transform(lambda x:(x==1).any())
0对
1正确
2正确
3正确
4正确
5对
6正确
7错误
8错误
9正确
名称:cat,数据类型:bool
使用我敏锐的模式识别技能,结果列的dtype似乎与原始列的相似。如果您能在transform功能中提供任何有关为什么会发生这种情况或发动机罩下发生了什么的提示,我将不胜感激。干杯
看起来SeriesGroupBy.transform()试图将结果数据类型强制转换为与原始列相同的数据类型,但DataFrameGroupBy.transform()似乎没有这样做:
[139]on
:df.groupby('id')['cat'].transform(lambda x:(x==1.any())
Output[139]:
0 1
1 1
2 1
3 1
4 1
5 1
6 1
7 0
8 0
9 1
名称:cat,数据类型:int64
#v v
At[140]on:df.groupby('id')[['cat']].transform(lambda x:(x==1).any())
Output[140]:
猫
0对
1正确
2正确
3正确
4正确
5对
6正确
7错误
8错误
9正确
In[141]:df.dtypes
Out[141]:
cat int64
id int64
数据类型:对象