【问题标题】:Arithmetic on a Series in Pandas DF With Conditional - Prior Operation Gets Overwritten有条件的 Pandas DF 中的一系列算术 - 先前的操作被覆盖
【发布时间】:2019-01-18 03:35:19
【问题描述】:

我正在抓取一些工资数据,我需要根据另一列将这些数据转换为每小时或年薪。我已经研究过如何做到这一点——这可能不是最有效的——但它适用于一条线路。

数据

import pandas as pd, numpy as np

columns = ['Location','Hourly','Annually','Monthly','Daily','Average','Hourly_Rate','Annual_Rate']
df = pd.DataFrame(columns=columns)
df.loc[1] = ['A',True,False,False,False,10.10,np.nan,np.nan]
df.loc[2] = ['B',False,True,False,False,50000,np.nan,np.nan]

df['Annual_Rate'] = (df['Average'] * 2080).where(df['Hourly'] == True) #need this line to run and not get overwritten
df['Annual_Rate'] = df['Average'].where(df['Annually'] == True ) #overwrites prior line
df['Annual_Rate'] = df['Average'].where(df['Annually'] == True & pd.isna(df['Annual_Rate'])) #overwrites prior line and is incorrect

df['Hourly_Rate'] = (df['Average'] / 2080).where([(df['Annually'] == True) & (pd.isnull(df['Hourly_Rate']))])
df['Hourly_Rate'] = df['Average'].where(df['Hourly'] == True & (pd.isna(df['Hourly_Rate'])))
df['Hourly_Rate'] = df['Average'].where(df['Hourly'] == True)
df.head(10)

这些是应该/我需要工作的行:

df['Hourly_Rate'] = (df['Average'] / 2080).where([(df['Annually'] == True) & (pd.isnull(df['Hourly_Rate']))])
df['Annual_Rate'] = (df['Average'] * 2080).where(df['Hourly'] == True)

期望的结果:

+---+----------+--------+----------+---------+-------+---------+-------------+-------------+
|   | Location | Hourly | Annually | Monthly | Daily | Average | Hourly_Rate | Annual_Rate |
+---+----------+--------+----------+---------+-------+---------+-------------+-------------+
| 1 | A        | TRUE   | FALSE    | FALSE   | FALSE |    10.1 |        10.1 |       21008 |
| 2 | B        | FALSE  | TRUE     | FALSE   | FALSE |   50000 | 24.03846154 |       50000 |
+---+----------+--------+----------+---------+-------+---------+-------------+-------------+

提前致谢。

【问题讨论】:

  • 你能告诉我们你期望的输出吗?
  • 是的 - 对此感到抱歉 - 添加了我正在寻找的两列/值。

标签: python python-3.x pandas numpy conditional


【解决方案1】:

pd.Series.wherenumpy.where 的工作方式不同。后者可用于指定矢量化 if-else 条件,并且可能是您需要的:

df['Annual_Rate'] = np.where(df['Hourly'], df['Average'] * 2080, df['Average'])

df['Hourly_Rate'] = np.where(df['Annually'] & df['Hourly_Rate'].isnull(),
                             df['Average'] / 2080, df['Average'])

pd.Series.where 更新具有给定值的系列,其中条件 满足,否则保持不变(在这种情况下,NaN 未指定时),如docs 中所述:

返回一个与 self 形状相同的对象及其对应的条目 来自自我,其中 cond 为True,否则来自其他

另请注意,您可以直接使用布尔系列而不是测试df[col] == True

【讨论】:

  • 好的,非常感谢 - 我现在只是实施它来检查 - 并感谢其他方向,检查它为什么在我的脚本中不起作用 - 也感谢布尔注释。
猜你喜欢
  • 2019-11-22
  • 1970-01-01
  • 2013-02-21
  • 2017-06-22
  • 2021-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多