Python熊猫:使用每种数据的规则加速筛选数据

Python熊猫:使用每种数据的规则加速筛选数据,python,performance,pandas,Python,Performance,Pandas,我正在比较新旧系统的输出。数据如下(总集庞大): 项目数量有限(20项) 有些差异是可以接受的,有些则不然。我们需要过滤掉可接受的,并写下为什么可接受的附加栏。1项可能有多个筛选规则 EX: 00000000001|a1|12|12.1| diff smaller than 1 上述差异取决于交易的货币(我们有交易/货币地图) 我的实现: #Load the file data=pandas.read_csv("output.diff.csv", sep=",", header = None,

我正在比较新旧系统的输出。数据如下(总集庞大):

项目数量有限(20项)

有些差异是可以接受的,有些则不然。我们需要过滤掉可接受的,并写下为什么可接受的附加栏。1项可能有多个筛选规则

EX: 00000000001|a1|12|12.1| diff smaller than 1
上述差异取决于交易的货币(我们有交易/货币地图)

我的实现:

#Load the file
data=pandas.read_csv("output.diff.csv", sep=",", header = None,     names=column_names)
#get item list
items=list(data.item.unique())
#scan through each item, filter data related to item and push it to function to process each item 
for item in items:
    dataoptions[item](data[data.item == item])

dataoptions = { 'a1': process_a1,
                'a2': process_a2, 
              }
def process_a1(df):
    #merge the transaction data frame with transaction currency data frame
    df1=pandas.merge(df,tran_currency,how='left')
    df1.old=pandas.to_numeric(df1.old)
    df1.new=pandas.to_numeric(df1.new)
    df1['Diff']=df1.old -df1.new
    #filter diff
    df2=df1[((df1.Diff <=1)&(df1.Diff >=-1)&(df1.currency == ''))|((df1.Diff <=2)&(df1.Diff >=-2)&(df1.currency != ''))]
    #write to acceptable file
    df2['Rule']='tolerant 1'
    df2[column_names_rules].to_csv(acceptable_outfile + "tolerant.csv", header=False,mode='a',index=False)
    #get remain diff
    df2=df1[~((df1.Diff <=1)&(df1.Diff >=-1)&(df1.currency == ''))|((df1.Diff <=2)&(df1.Diff >=-2)&(df1.currency != ''))]
    df3=df2[column_names]

    process_a1_rule2(df3)
#加载文件
data=pandas.read_csv(“output.diff.csv”,sep=“,”,header=None,names=column_name)
#获取项目列表
items=list(data.item.unique())
#扫描每个项目,筛选与项目相关的数据,并将其推送到函数以处理每个项目
对于项目中的项目:
dataoptions[item](数据[data.item==item])
dataoptions={'a1':进程\ a1,
“a2”:过程_a2,
}
def过程_a1(df):
#将交易数据框与交易货币数据框合并
df1=pandas.merge(df,交易货币,how='left')
df1.old=pandas.to_numeric(df1.old)
df1.new=pandas.to_numeric(df1.new)
df1['Diff']=df1.old-df1.new
#滤光片差
df2=df1[((df1.Diff=-1)和(df1.currency=='')|((df1.Diff=-2)和(df1.currency!='')]
#写入可接受的文件
df2[“规则”]=“容忍1”
df2[列名称\u规则]。到\u csv(可接受的\u输出文件+“容差.csv”,标题=False,模式=a',索引=False)
#保持差异
df2=df1[~(df1.Diff=-1)和(df1.currency=='')|((df1.Diff=-2)和(df1.currency!='')]
df3=df2[列名称]
过程规则2(df3)

我觉得还是很慢,所以需要你的建议。非常感谢

如果
dataoptions
是某个函数,则
apply
会更快:

items=list(data.item.unique())
for item in items:
    dataoptions[item](data[data.item == item])
更改为:

def f(x):
    #print (x)
    #print (x.name)
    #print (dataoptions[x.name])
    return dataoptions[x.name](x)

df4 = df.groupby('item').apply(f)

您可以更改-添加参数
errors='concurve'
,以便将非数字解析为
NaN

df1.old=pandas.to_numeric(df1.old, errors='coerce')
df1.new=pandas.to_numeric(df1.new, errors='coerce')

也不必再次创建条件,最好是创建掩码,然后仅通过
~
将其反转为
df3
,以便通过
掩码和列名进行选择:

mask=((df1.Diff=-1)和(df1.currency=='')|
((df1.Diff=-2)和(df1.currency!='')
df2=df1[遮罩]
df2[“规则”]=“容忍1”
df2[列名称\u规则]。到\u csv(可接受的\u输出文件+“容差.csv”,
标题=假,模式=a',索引=假)
df3=df1.loc[~掩码,列名称]

tran\u currency
dataframe的哪些列?列
货币
在哪里?某些
dataoptions
循环是否与
process\u a1
相连?谢谢。tran_货币有两列trấ国家和货币。数据选项是dic,例如:a1:过程\ a1。因此,当输入项为a1时,它将调用进程a1,因此需要通过dict
Dataoptions
过滤数据吗?您可以将其添加到示例答案中吗?数据选项是dic,例如:a1:process_a1。因此,当输入项为a1时,它将调用process_a1谢谢,但如果没有示例,则很难使用
groupby
验证我的解决方案。所以我添加了自定义功能,我认为这会很有帮助。非常感谢。我采纳了你的建议。那么df4是不是数据帧返回的差异在所有过滤器之后都会保留?
df1.old=pandas.to_numeric(df1.old, errors='coerce')
df1.new=pandas.to_numeric(df1.new, errors='coerce')
mask = ((df1.Diff <=1)&(df1.Diff >=-1)&(df1.currency == ''))|
       ((df1.Diff <=2)&(df1.Diff >=-2)&(df1.currency != ''))
df2=df1[mask]

df2['Rule']='tolerant 1'
df2[column_names_rules].to_csv(acceptable_outfile + "tolerant.csv", 
                               header=False,mode='a',index=False)

df3 = df1.loc[~mask, column_names]