我不明白为什么在对同一数据框调用apply
和transform
时,它们返回不同的数据类型。之前我对这两个函数的解释是:apply
会将数据合并,而transform
与apply
完全相同,但保留原始索引且不合并。请考虑以下内容。
df = pd.DataFrame({'id': [1,1,1,2,2,2,2,3,3,4],
'cat': [1,1,0,0,1,0,0,0,0,1]})
让我们识别那些在 cat
列中有非零条目的 id
。
>>> df.groupby('id')['cat'].apply(lambda x: (x == 1).any())
id
1 True
2 True
3 False
4 True
Name: cat, dtype: bool
好的。然而,如果我们想创建一个指示列,可以执行以下操作。
>>> df.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
Name: cat, dtype: int64
我不明白为什么现在的数据类型是int64
,而不是any()
函数返回的布尔类型。
当我改变原始数据帧以包含一些布尔值时(请注意,零仍保留),转换方法会在一个object
列中返回布尔值。这对我来说是一个额外的谜团,因为所有的值都是布尔值,但显然为了匹配整数和布尔值混合类型的原始列的dtype
,它被列为object
。
df = pd.DataFrame({'id': [1,1,1,2,2,2,2,3,3,4],
'cat': [True,True,0,0,True,0,0,0,0,True]})
>>> df.groupby('id')['cat'].transform(lambda x: (x == 1).any())
0 True
1 True
2 True
3 True
4 True
5 True
6 True
7 False
8 False
9 True
Name: cat, dtype: object
然而,当我使用全部布尔值时,转换函数会返回一个布尔列。
df = pd.DataFrame({'id': [1,1,1,2,2,2,2,3,3,4],
'cat': [True,True,False,False,True,False,False,False,False,True]})
>>> df.groupby('id')['cat'].transform(lambda x: (x == 1).any())
0 True
1 True
2 True
3 True
4 True
5 True
6 True
7 False
8 False
9 True
Name: cat, dtype: bool
通过我的敏锐的模式识别技能,似乎结果列的 dtype
与原始列的相同。我会感激任何关于为什么会发生这种情况或在 transform
函数中发生了什么的提示。干杯。
apply
不会合并数据。apply
很灵活,可以返回任何大小的系列或数据帧。transform
始终保留每个组的行数。transform
还将每个单独的列作为系列发送到调用函数。apply
将整个数据帧发送到调用函数。 - Ted Petrou