python Pandas 数据框: need speed up process related to calculate 3 rows data

标签 python pandas dataframe

我有如下数据:

Tran|Type|Amount|comment
1212|A|12|Buy
1212|AA|13|Buy
1212|CC|25|S
1213|AA|1112|B
1213|A|78|B
1213|CC|1190|SEllding
1214|AA|1112|B
1214|A|78|B
1214|CC|1190|SEllding
1215|AA|1112|B
1215|A|78|B
1216|AA|1112|B


....

我需要过滤掉所有具有 3 个类型 A、AA、CC 和 A.Amount + AA.Amount= CC.Amount 的交易

数据量巨大(1亿条记录)

我的代码如下,但是运行起来很慢

df1=df.groupby("tran").filter(lambda x: len(x) == 3)
listrefn=df1.tran.tolist()
df1=df[df.tran.isin(listrefn)]
df2=df1[df1.field=='A']
dfA=df2[['tran','Amount']]
df2=df1[df1.field=='AA']
dfAA=df2[['tran','Amount']]
df2=df1[df1.field=='CC']
dfCC=df2[['tran','Amount']]

dfA=dfA.rename(columns={'tran':'tran','Amount':'A'})
dfAA=dfAA.rename(columns={'tran':'tran','Amount':'AA'})
dfCC=dfCC.rename(columns={'tran':'tran','Amount':'CC'})

dftmp=pandas.merge(dfA,dfAA,how='left')
dftmp1=pandas.merge(dftmp,dfCC,how='left')
dftmp1['diff']=dftmp1.A-dftmp1.AA-dftmp1.CC
dftmp=dftmp1[['tran','diff']]
dftmp1=dftmp[dftmp['diff']==0]

请大家帮忙指教

最佳答案

您可以使用 pivotquery :

#If necessary filtering:
#df = df[df.groupby("Tran")['Type'].transform('size') == 3]

idx = df.pivot(index='Tran', columns='Type', values='Amount').query('A + AA == CC').index
print (idx)
Int64Index([1212, 1213, 1214], dtype='int64', name='Tran')

df = df[df.Tran.isin(idx)]
#same as
#df = df.query('Tran in @idx')
print (df)
   Tran Type  Amount   comment
0  1212    A      12       Buy
1  1212   AA      13       Buy
2  1212   CC      25         S
3  1213   AA    1112         B
4  1213    A      78         B
5  1213   CC    1190  SEllding
6  1214   AA    1112         B
7  1214    A      78         B
8  1214   CC    1190  SEllding

过滤的另一种解决方案:

df = df.set_index('Tran').loc[idx].reset_index()
print (df)
   Tran Type  Amount   comment
0  1212    A      12       Buy
1  1212   AA      13       Buy
2  1212   CC      25         S
3  1213   AA    1112         B
4  1213    A      78         B
5  1213   CC    1190  SEllding
6  1214   AA    1112         B
7  1214    A      78         B
8  1214   CC    1190  SEllding

关于 python Pandas 数据框: need speed up process related to calculate 3 rows data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43226050/

相关文章:

python - `object in list` 的行为与 `object in dict` 不同?

python - 如何使用 lxml 创建文档的子集?

python - 按星期几排序列?

python - 检测列中两个连续的空值

python - 如何使用 Pandas 选择所有非 NaN 列和非 NaN 最后一列?

python - 如何与 getattr() 结合使用 lambda : in python? 动态加载 python 模块

python - 如何使用 linkchecker 忽略包含图像格式的 URL

r - 如何绘制一个网格,其中我的数据是数据框中的列表?

Python Pandas Dataframe 数据透视表列和值顺序

python - 高效返回数组中第一个满足条件的值的索引