Pandas - 使用 transform 对分组进行操作

3

这是我的例子:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A A': ['one', 'one', 'two', 'two', 'one'] ,
                   'B': ['Ar', 'Br', 'Cr', 'Ar','Ar'] ,
                   'C': ['12/15/2011', '11/11/2001', '08/30/2015', '07/3/1999','03/03/2000' ],
                      'D':[1,7,3,4,5]})

df['C'] = pd.to_datetime(df['C'])

def date_test(x):
    key_date = pd.Timestamp(np.datetime64('2015-08-13'))
    end_date = pd.Timestamp(np.datetime64('2016-10-10'))
    result = False

    for i in x.index:
        if key_date < x[i] < end_date:
            result = True

    return result

def int_test(x):
    result = False
    for i in x.index:
        if 1 < x[i] < 9:
            result = True

    return result

现在我正在按列B进行分组,并转换列CD 以下代码生成了一个列为1的列。
df.groupby(['B'])['D'].transform(int_test)

以下代码会生成日期列:
df.groupby(['B'])['C'].transform(date_test)

我希望它们都能生成1和0的集合而不是日期。我的目标是得到1和0的集合。有什么想法吗?

更新:我的主要目标是了解transform的工作原理。


1
解释 int_test 和 date_test 的算法意图。 - Zeugma
@Boud,我正在尝试从这两种方法中生成掩码。使用date_test,我有不同的目标,但一个特定的目标是找出日期组是否有两个连续的日期位于特定时间间隔内。这是我的大目标,但我在上面的示例中简化了它。 - user1700890
1个回答

2
为了保持与后续操作的类型一致性,你可以对transform调用的结果进行转换,使其成为选定数据类型的Series。该函数源代码已明确进行了这种类型转换。
你的布尔数据可以转换为日期,从而获得一个日期时间序列。显式地进行int类型转换以获得预期的类型:
df.groupby(['B'])['C'].transform(date_test).astype('int64')

我尝试了一下,但是返回了 TypeError: cannot astype a datetimelike from [datetime64[ns]] to [int32] - user1700890
嘿,快问一句,如果“transform”无法将数据转换为原始数据类型,那会发生什么? - user1700890
1
函数将接受 - Zeugma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接