我有一个金融交易的大数据帧(150000 x 25)。此数据框表示一种金融控股账户,因此交易通常“通过”此分类账。例如(下面),位置0中的行显示一笔-123.21美元的交易。位置2中的行是+$123.21的对应(或“耦合”)交易,与类别、类型和来源匹配
我的目标是创建一个新列来标识“耦合”事务的键。因此,第0行的“耦合键”是第2行的键,反之亦然
注意,位置9-14中的行排除了搜索最小和最大匹配的解决方案(@David Erickson previously provided这是沿着这些线的一个很好的答案)。位置9的行显示+10美元的交易。它与位置11中的第一笔-10美元(而不是位置14中的交易)结合在一起。通过这种方式,每个事务与零个或一个其他事务耦合,但不超过一个
import pandas as pd
d_in = {'key' : ['80000001', '80000002', '80000003', '80000004', '80000005', '80000006', '80000007', '80000008', '80000009', '80000010', '80000011', '80000012', '80000013', '80000014', '80000015'],
'date' : ['20200901', '20200901', '20200902', '20200902', '20200902','20200903', '20200904', '20200905', '20200905', '20200906', '20200906', '20200906', '20200906', '20200906', '20200906'],
'category' : ['Z293', 'B993', 'Z293', 'B993', 'W884', 'C123', 'V332', 'C123', 'V332', 'Z213', 'Z213', 'Z213', 'Z213', 'Z213', 'Z213'],
'type' : ['tools', 'supplies', 'tools', 'supplies', 'repairs', 'custom', 'misc', 'custom', 'misc', 'technology', 'technology', 'technology', 'technology', 'technology', 'technology'],
'source' : ['Q112', 'E443', 'Q112', 'E443', 'P443', 'B334', 'E449', 'B334', 'E449', 'QQ32', 'QQ32', 'QQ32', 'QQ32', 'QQ32', 'QQ32'],
'amount' : [-123.21, 3.12, 123.21, -3.12, 9312.00, 312.23, -13.23, -312.23, 13.23, 10, 10, -10, -10, 10, -10]}
df_in = pd.DataFrame(data=d_in)
d_out = {'key' : ['80000001', '80000002', '80000003', '80000004', '80000005', '80000006', '80000007', '80000008', '80000009', '80000010', '80000011', '80000012', '80000013', '80000014', '80000015'],
'date' : ['20200901', '20200901', '20200902', '20200902', '20200902','20200903', '20200904', '20200905', '20200905', '20200906', '20200906', '20200906', '20200906', '20200906', '20200906'],
'category' : ['Z293', 'B993', 'Z293', 'B993', 'W884', 'C123', 'V332', 'C123', 'V332', 'Z213', 'Z213', 'Z213', 'Z213', 'Z213', 'Z213'],
'type' : ['tools', 'supplies', 'tools', 'supplies', 'repairs', 'custom', 'misc', 'custom', 'misc', 'technology', 'technology', 'technology', 'technology', 'technology', 'technology'],
'source' : ['Q112', 'E443', 'Q112', 'E443', 'P443', 'B334', 'E449', 'B334', 'E449', 'QQ32', 'QQ32', 'QQ32', 'QQ32', 'QQ32', 'QQ32'],
'amount' : [-123.21, 3.12, 123.21, -3.12, 9312.00, 312.23, -13.23, -312.23, 13.23, 10, 10, -10, -10, 10, -10],
'coupling_key' : ['80000003', '80000004', '80000001', '80000002', 'none', '80000008', '80000009', '80000006', '80000007', '80000012', '80000013', '80000010', '80000011', '80000015', '80000014']}
df_out = pd.DataFrame(data=d_out)
我所探索的大多数解决方案都涉及到按功能分组。我目前正在考虑groupby(…).nth(…)函数。我怀疑解决方案可能还涉及.mask或.duplicated()
您可以执行以下操作:
步骤1:设置
transform
功能:步骤2:应用于组:
结果:
(我假设
date
列的顺序与示例中相同。)另一个解决方案是,尝试使用“纯熊猫”函数(不管这意味着什么!)
要理解以下内容,请执行以下步骤
cumcount()
)reversed(..)
),转换成一个数据帧,并连接到原始数据帧第5步可能会做得更优雅,但这是可行的
生成所需的df_输出:
如果
amount
列中有零,并且它们应该根据下面的注释进行匹配,我们可以如下修改循环将
df_in
扩展为这样(注意末尾的三个0行:我们得到(忽略与前面相同的行)
相关问题 更多 >
编程相关推荐