有两个框架 - 含税的订单和每种产品的税务指南。
必须为每个产品代码选择那些“税”值高于“参考书”标准值的订单。
这是代码:
import pandas as pd
def marker(g, epsilon):
"""Mark."""
g = g.query("fee + fee_preview < -@epsilon")
return g
df_orders = pd.DataFrame({
"order_id": list(range(1, 14)),
"sku": 9 * ["a", ] + 4 * ["b", ],
"fee_amount": [-1, -1, -1, -1, -1.1, -0.8, -1.1, -2, -2, -2.1, -2.1, -2.1, -4.3],
"quanty": 7 * [1, ] + 2 * [2, ] + 3 * [1, ] + [2, ],
})
print(df_orders)
df_fee = pd.DataFrame({
"fee": [1, 0.8, 2.1, 4.3],
"sku": ["a", "d", "b", "g"],
})
print(df_fee)
df_orders["fee"] = df_orders["fee_amount"] / df_orders["quanty"]
df = df_orders.join(df_fee.set_index("sku"), on="sku", rsuffix="_preview")
dd = df.groupby("sku").apply(marker, 0.005)
print(dd)
一切正常,结果如下:
order_id sku fee_amount quanty
0 1 a -1.0 1
1 2 a -1.0 1
2 3 a -1.0 1
3 4 a -1.0 1
4 5 a -1.1 1
5 6 a -0.8 1
6 7 a -1.1 1
7 8 a -2.0 2
8 9 a -2.0 2
9 10 b -2.1 1
10 11 b -2.1 1
11 12 b -2.1 1
12 13 b -4.3 2
fee sku
0 1.0 a
1 0.8 d
2 2.1 b
3 4.3 g
order_id sku fee_amount quanty fee fee_preview
sku
a 4 5 a -1.1 1 -1.10 1.0
6 7 a -1.1 1 -1.10 1.0
b 12 13 b -4.3 2 -2.15 2.1
但是我对.join()膨胀中间帧的操作感到困惑。
难道没有类似的“更多 SQL”,或者其他更经济地使用内存的解决方案吗?
Pandas 中大部分方法和函数返回新创建的结果 DataFrame。某些函数支持
inplace=True使用节省内存来“就地”替换 DataFrame 的选项。但是 Pandas 开发人员自己认为这个看似有用的功能是邪恶的,并希望在未来的版本中摆脱它。因此,您的解决方案是很正常的。
如果您只需要添加一个新列,加入另一列,您可以使用Series.map()方法:
但无论如何,最好在相当大的数据集上比较两种方法的性能......
我找到了解决方案。下面是组处理函数的样子:
#1 - 定义 组的sku
#2 - 过滤所需的行,与原始版本几乎没有变化
#3 - 向组添加一列,其中添加了控制“税”费
现在通话没有加入。代替
现在:
额外的中间 df框架被“触发”......
有趣的是,在每个组的级别添加了一个列,然后由 pandas groupby自动合并。很高兴这是可能的。