【问题标题】:Pandas - operations on groups using transformPandas - 使用变换对组进行操作
【发布时间】:2017-02-24 06:39:58
【问题描述】:

这是我的例子:

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

以下代码生成一列。

df.groupby(['B'])['D'].transform(int_test)

以下代码生成日期列

df.groupby(['B'])['C'].transform(date_test)

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

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

【问题讨论】:

  • 解释int_test和date_test的算法意图
  • @Boud,我正在尝试从这两种方法生成掩码。对于date_test,我有不同的目标,但一个特定的目标是确定一组日期是否连续两天位于特定的时间间隔内。这是我的大目标,但我在上面的示例中对其进行了简化。

标签: python pandas transform


【解决方案1】:

为了与后续操作的类型一致性,您可以对transform 调用的结果进行操作,该函数尝试将生成的 Series 转换为它所针对的所选数据的 dtype。函数源代码明确地完成了这个 dtype 转换。

您的布尔数据可以转换为日期,从而获得日期时间序列。显式转换为int 以获得预期的类型:

df.groupby(['B'])['C'].transform(date_test).astype('int64')

【讨论】:

  • 我试过了,但回来了TypeError: cannot astype a datetimelike from [datetime64[ns]] to [int32]
  • 嘿,快速提问,如果transform 无法转换为原始数据类型,那么会发生什么?
  • 该功能将除外
猜你喜欢
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多