繁体   English   中英

这里有一种方法可以遍历 PANDAS 中的数据帧并乘以 2 个不同的条件吗?

[英]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() 是非常耗费资源的。

您可以使用applylambda

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM