熊猫 - 用多个参数进行分组和转换

时间:2016-11-22 18:33:27

标签: python pandas group-by transform

这是我的数据框:

import pandas as pd
df = pd.DataFrame({'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],
                   'F': ['12/1/2011','10/1/2000','8/15/2015','12/1/2011','12/1/2011'] })
df['C'] = pd.to_datetime(df['C'])
df['F'] = pd.to_datetime(df['F'])

我希望按列B进行分组,然后针对每个组检查列C是否包含列F后30天内的日期。我会找回整个组的指标列,它应该看起来像

df['indicator'] = [1,0,1,1,1]

这是我试过的:

def date_test(x, y):

    result = False
    for i in x.index:
        if x[i]<y[i]+ pd.Timedelta(days=30):
            result = True

    return result

df['indicator'] = df.groupby('B')['C','F'].transform(date_test).astype('int64')

但我回来了TypeError: Transform function invalid for data types

所以我想我不能通过两列来转换函数。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我认为你是对的,.transform()的工作方式是传递的函数分别评估每一列(在本例中为C和F)。有关详细信息,请参阅here

但是,我认为你可以使用.apply()并获得你想要的结果:

>>> dfGroup = df.groupby('B')
>>> dfGroup.apply(lambda x: x['C'] < x['F'] + pd.Timedelta(days=30))
>>> B    
    Ar  0     True
        3     True
        4     True
    Br  1    False
    Cr  2     True
    dtype: bool

答案 1 :(得分:1)

我不知道它是否会对你有所帮助,但是:

<plugin> 
<artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                       <mainClass>com.app.appmain</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
            </configuration>
        </plugin>
 <dependencies>
   <dependency>
        <groupId>commons-cli</groupId>
        <artifactId>commons-cli</artifactId>
        <version>1.3</version>
    </dependency>
   </dependencies>

然后在for循环中运行它以读取df = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four', 'indicator':[]} if 'one' in df.values() == True: df['indicator'].append(1) else: df['indicator'].append(0)

中的所有元素
相关问题