Python 如何有效地过滤数据帧

Python 如何有效地过滤数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个庞大的消费者交易数据集(1亿行),如下所示: df = pd.DataFrame({'id':[1, 1, 2, 2, 3],'brand':['a','b','a','a','c'], 'date': ['01-01-2020', '01-02-2020', '01-05-2019', '01-06-2019', '01-12-2018']}) 对于每一行(每笔交易),我想检查同一个人(相同的“id”)过去是否为不同的品牌购买了。生成的数据集应如下所示: id brand

我有一个庞大的消费者交易数据集(1亿行),如下所示:

df = pd.DataFrame({'id':[1, 1, 2, 2, 3],'brand':['a','b','a','a','c'], 'date': ['01-01-2020', '01-02-2020', '01-05-2019', '01-06-2019', '01-12-2018']})
对于每一行(每笔交易),我想检查同一个人(相同的“id”)过去是否为不同的品牌购买了。生成的数据集应如下所示:

    id  brand  date        check
0   1   a      01-01-2020  0  
1   1   b      01-02-2020  1
2   2   a      01-05-2019  0
3   2   a      01-06-2019  0
4   3   c      01-12-2018  0
现在,我的解决方案是:

def past_transaction(row):
    x = df[(df['id'] == row['id']) & (df['brand'] != row['brand']) & (df['date'] < row['date'])]
    if x.shape[0]>0:
        return 1
    else:
        return 0

df['check'] = df.appy(past_transaction, axis=1)
def过去_事务(行):
x=df[(df['id']==行['id'])和(df['brand']!=行['brand'])和(df['date']<行['date'])]
如果x.shape[0]>0:
返回1
其他:
返回0
df['check']=df.appy(过去的交易,axis=1)
这样做效果很好,但性能非常糟糕。有没有更有效的方法(有或没有熊猫)?谢谢

A)使用内置功能 第一步是利用熊猫,而不是制作自己的功能:

df['check'] = np.logical_and(df.id.duplicated(), ~df[['id','brand']].duplicated())
这将使你的代码更快

B) 利用硬件 如果RAM允许,选择使用机器中的所有内核。您可以使用或任何替代方法。我建议这样做是因为它的变化很小,并且会根据您机器的配置提供指数级的加速

C) 大数据框架 如果这是一个大数据问题,您应该已经使用了用于处理大数据的数据帧或数据帧,因为pandas不用于处理如此大量的数据

在处理a时,我发现有些事情很有效。

a)使用内置函数 第一步是利用熊猫,而不是制作自己的功能:

df['check'] = np.logical_and(df.id.duplicated(), ~df[['id','brand']].duplicated())
这将使你的代码更快

B) 利用硬件 如果RAM允许,选择使用机器中的所有内核。您可以使用或任何替代方法。我建议这样做是因为它的变化很小,并且会根据您机器的配置提供指数级的加速

C) 大数据框架 如果这是一个大数据问题,您应该已经使用了用于处理大数据的数据帧或数据帧,因为pandas不用于处理如此大量的数据


在处理a时,我发现有些事情很有效。

我个人会使用两个布尔值

首先检查
id
是否重复。 第二是检查那些没有重复的id和品牌

import numpy as np 

s = df.duplicated(subset=['id'],keep='first')
s1 = ~df.duplicated(subset=['id','brand'],keep=False)
df['check'] = np.where(s & s1,1,0)


   id brand        date  check
0   1     a  01-01-2020      0
1   1     b  01-02-2020      1
2   2     a  01-05-2019      0
3   2     a  01-06-2019      0
4   3     c  01-12-2018      0

我个人会用两个布尔人

首先检查
id
是否重复。 第二是检查那些没有重复的id和品牌

import numpy as np 

s = df.duplicated(subset=['id'],keep='first')
s1 = ~df.duplicated(subset=['id','brand'],keep=False)
df['check'] = np.where(s & s1,1,0)


   id brand        date  check
0   1     a  01-01-2020      0
1   1     b  01-02-2020      1
2   2     a  01-05-2019      0
3   2     a  01-06-2019      0
4   3     c  01-12-2018      0

首先,您使用的是
apply
,此时您的核心功能将使性能比现在快100倍。其次,pandas不适用于大数据工作流。将它放在SQL db中,并在关键列上创建索引,或者使用类似于
spark
dask
的方法。首先,当您拥有核心函数时,您使用的是
apply
,这将使性能比现在快100倍。其次,pandas不适用于大数据工作流。将它放在SQL数据库中,并在关键列上创建索引,或者使用类似于
spark
dask
的方法,谢谢您的建议。代码抛出了一个Keyerror:(更新了!现在不应该!谢谢你的建议。代码抛出了一个Keyerror:(更新了!现在不应该!)!