仅供参考,性能/速度对于这个问题并不重要。
我有一个名为cost_table...的现有熊猫数据框
+----------+---------+------+-------------------------+-----------------+
| material | percent | qty | price_control_indicator | acct_assign_cat |
+----------+---------+------+-------------------------+-----------------+
| abc111 | 1.00 | 50 | v | # |
| abc222 | 0.25 | 2000 | s | # |
| xyz789 | 0.45 | 0 | v | m |
| def456 | 0.9 | 0 | v | # |
| 123xyz | 0.2 | 0 | v | m |
| lmo888 | 0.6 | 0 | v | m |
+----------+---------+------+-------------------------+-----------------+
我需要cost_source根据多个字段中的值添加一个字段。
google 上出现的大多数答案都涉及列表推导式或三元运算符,但那些仅包含基于一列中的值的逻辑。例如,
cost_table['cost_source'] = ['map' if qty > 0 else None for qty in cost_table['qty']]
这基于一列中的值起作用,但我不知道如何扩展它以包含多列中的逻辑(或者甚至可能?)。它似乎也不是一个非常可读/可维护的解决方案。
我尝试使用for in带有if elif语句的循环,但 in 的值cost_table['cost_source']保持不变并且适用None于所有行。但是,如果我在循环中打印每一行,则row['cost_source']具有所需的值。
d = {
'material': ['abc111', 'abc222', 'xyz789', 'def456', '123xyz', 'lmo888'],
'percent': [1, .25, .45, .9, .2, .6],
'qty': [50, 2000, 0, 0, 0, 0],
'price_control_indicator': ['v', 's','v', 'v', 'v', 'v'],
'acct_assign_cat': ['#', '#', 'm', '#', 'm', 'm']
}
cost_table = pd.DataFrame(data=d)
cost_table['cost_source'] = None
for index, row in cost_table.iterrows():
if (row['qty'] > 0) or (row['price_control_indicator'] == "s") or (row['acct_assign_cat'] == "#"):
row['cost_source'] = "map"
elif (row['percent'] >= 40) and (row['acct_assign_cat'] == "m"):
row['cost_source'] = "vendor"
else:
row['cost_source'] = None
print(row['cost_source']) # outputs map, vendor, or None as expected
print(cost_table)
哪个输出...
catspeake
30秒到达战场
相关分类