Python熊猫:使用每种数据的规则加速筛选数据
我正在比较新旧系统的输出。数据如下(总集庞大): 项目数量有限(20项) 有些差异是可以接受的,有些则不然。我们需要过滤掉可接受的,并写下为什么可接受的附加栏。1项可能有多个筛选规则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,
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,因此需要通过dictDataoptions
过滤数据吗?您可以将其添加到示例答案中吗?数据选项是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]