[英]Is here a way to loop through dataframe in PANDAS and multiply by 2 different conditions?
本质上,我正在使用数据框,并且试图乘以 2 个不同的条件。 如果订单描述中的值 == Internet Port Charge,则需要在amount
栏中乘以 0.33,否则乘以 1.9。 我不断收到价值错误。 谢谢!
for x in max_sales:
if max_sales['Order description'] == 'Internet Port Charge':
max_sales['amount'] * .33
else:
max_sales['amount'] * 111.9
1 for x in max_sales:
----> 2 if max_sales['Order description'] == 'Internet Port Charge':
3 max_sales['amount'] * .33
4 else:
5 max_sales['amount'] * 111.9
~\Anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
1535 @final
1536 def __nonzero__(self):
-> 1537 raise ValueError(
1538 f"The truth value of a {type(self).__name__} is ambiguous. "
1539 "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
你可以使用 NumPy 的.where()
:
import numpy as np
max_sales['amount'] = np.where(
max_sales['Order description'] == 'Internet Port Charge',
max_sales['amount'] * .33,
max_sales['amount'] * 111.9
)
这将查找满足条件的行并将这些值乘以 0.33。 如果条件为 False,则乘以 111.9。 它也比遍历 DataFrame 快得多(也更干净)。
如果你只有这些条件,那么 .loc 你想乘以一个数量的部分,然后分配给他们那个数量:
max_sales.loc[max_sales['Order description'] == 'Internet Port Charge']['amount'] = max_sales.loc[max_sales['Order description'] == 'Internet Port Charge']['amount']*0.33
max_sales.loc[~(max_sales['Order description'] == 'Internet Port Charge')]['amount'] = max_sales.loc[~(max_sales['Order description'] == 'Internet Port Charge')]['amount']*1.9
我看不到for x in max_sales
应该做什么,因为 x 以后不再使用。
for index, row in df.iterrows():
if row['Order description'] == 'Internet Port Charge':
row['amount'] = row['amount'] * 0.33
else:
row['amount'] = row['amount'] * 111.9
您必须使用 .iterrows() 遍历 DataFrame,然后您可以单独访问每一行
.iterrows() 是非常耗费资源的。
您可以使用apply
和lambda
:
import pandas as pd
# Set up dummy data
df = [
["Internet Port Change", 20],
["Foobar", 20]
]
df = pd.DataFrame(df, columns=["Order description", "amount"])
# Order description amount
# 0 Internet Port Change 20
# 1 Foobar 20
# Use apply and lambda
df["amount"] = df.apply(
lambda x: x["amount"]*0.33 if x["Order description"] == "Internet Port Change" \
else x["amount"]*111.9,
axis=1)
# Order description amount
# 0 Internet Port Change 6.6
# 1 Foobar 2238.0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.