【问题标题】:Pandas Dataframe: Multiplying Two Columns熊猫数据框:将两列相乘
【发布时间】:2020-04-06 09:54:49
【问题描述】:

我正在尝试将数据框 (OPR) 中的两列 (ActualSalary * FTE) 相乘以创建一个新列 (FTESalary),但不知何故它已停在第 21357 行,我不明白出了什么问题或如何解决修理它。这两列来自使用以下行导入 csv 文件:OPR = pd.read_csv('OPR.csv', encoding='latin1')

[In] OPR
[out]
ActualSalary    FTE
44600           1
58,000.00       1
70,000.00       1
17550           1
34693           1
15674           0.4

[In] OPR["FTESalary"] = OPR["ActualSalary"].str.replace(",", "").astype("float")*OPR["FTE"]
[In] OPR
[out]
ActualSalary    FTE FTESalary
44600           1   44600
58,000.00       1   58000
70,000.00       1   70000
17550           1   NaN
34693           1   NaN
15674           0.4 NaN

我根本不期望任何 NULL 值作为输出,我真的很挣扎。我非常感谢您的帮助。 提前谢谢了! (我是编码和这里的新手,如果我犯了错误或可以改进我在这里发布问题的方式,请通过消息告诉我)

分享数据@oppresiveslayer

[In] OPR[0:6].to_dict()
[out]
{'ActualSalary': {0: '44600',
1: '58,000.00',
2: '70,000.00',
3: '39,780.00',
4: '0.00',
5: '78,850.00'},
 'FTE': {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 1.0, 5: 1.0}}

有关这两列的更多信息@charlesreid1

[in] OPR['ActualSalary'].astype
[out]
Name: ActualSalary, Length: 21567, dtype: object>

[in] OPR['FTE'].astype
[out]
Name: FTE, Length: 21567, dtype: float64>

我正在使用的版本: python: 3.7.3, pandas: jupyter Notebook 6.0.0 上的 0.25.1

【问题讨论】:

  • 这对我来说是一本好书,有很多东西要学,但不幸的是,我在这里遇到的问题并不完全相同。谢谢@charlesreid1
  • 通过 construct 数据框,您是指我最初是如何拥有这些数据的吗?我已经从 csv 文件中加载了它。 ActualSalary 是 dtype: object,而 FTE 是 dtype: float64。我现在将修改我的问题以包含此内容

标签: python pandas matrix-multiplication


【解决方案1】:

这应该可行:

OTR['FTESalary'] = OTR.apply(lambda x: pd.to_numeric(x['ActualSalary'].replace(",", ""), errors='coerce') * x['FTE'], axis=1)

输出

  ActualSalary  FTE  FTESalary
0        44600  1.0    44600.0
1    58,000.00  1.0    58000.0
2    70,000.00  1.0    70000.0
3        17550  1.0    17550.0
4        34693  1.0    34693.0
5        15674  0.4     6269.6

好的,我认为你需要这样做:

OTR['FTESalary'] = OTR.reset_index().apply(lambda x: pd.to_numeric(x['ActualSalary'].replace(",", ""), errors='coerce') * x['FTE'], axis=1).to_numpy().tolist() 

【讨论】:

  • 我已尝试将您的代码应用到我的代码中,但出现以下错误(我仍处于学习这些消息含义的早期阶段...)AttributeError: ("'int' object has no attribute 'replace'", 'occurred at index 20480')
  • @sylvia,pd.__version__ 的输出是什么,我想我需要安装你的版本才能看到错误消息。我不介意这样做,所以我可以得到一个工作版本
  • 它是'0.25.1'(感谢教我如何检查版本)@oppressionslayer
  • @SyLviA 好的,我添加了一个更新,你可以试试。我遇到了和你一样的错误,所以我想我已经解决了。这实际上不是错误,而是因为我们需要 reset_index ,因为您已经设置了索引。
  • 我仍然有同样的错误:AttributeError: ("'int' object has no attribute 'replace'", 'occurred at index 20480') 这是因为我不知道如何“清理”原始 csv 文件吗? @oppressionslayer
【解决方案2】:

我可以通过几个步骤来完成它,但是列表理解对于初学者来说可能不太容易阅读。它创建了一个中间列,它进行浮点转换,因为您的 ActualSalary 列在开始时充满了字符串。

OPR["X"] = [float(x.replace(",","")) for x in OPR["ActualSalary"]]
OPR["FTESalary"] = OPR["X"]*OPR["FTE"]

【讨论】:

  • 我在上面使用了你的代码,不幸的是我仍然遇到同样的问题。
【解决方案3】:

我相信您的ActualSalary 列是字符串和整数的混合体。这是我能够重现您的错误的唯一方法:

df = pd.DataFrame(
    {'ActualSalary': ['44600', '58,000.00', '70,000.00', 17550, 34693, 15674],
     'FTE': [1, 1, 1, 1, 1, 0.4]})

>>> df['ActualSalary'].str.replace(',', '').astype(float) * df['FTE']
0    44600.0
1    58000.0
2    70000.0
3        NaN
4        NaN
5        NaN
dtype: float64

当您尝试删除逗号时会出现问题:

>>> df['ActualSalary'].str.replace(',', '')
0       44600
1    58000.00
2    70000.00
3         NaN
4         NaN
5         NaN
Name: ActualSalary, dtype: object

首先将它们转换为字符串,然后再转换回浮点数。

fte_salary = (
    df['ActualSalary'].astype(str).str.replace(',', '')  # Remove commas in string, e.g. '55,000.00' -> '55000.00'
    .astype(float)  # Convert string column to floats.
    .mul(df['FTE'])  # Multiply by new salary column by Full-Time-Equivalent (FTE) column.
)
>>> df.assign(FTESalary=fte_salary)  # Assign new column to dataframe.
      ActualSalary  FTE  FTESalary
    0        44600  1.0    44600.0
    1    58,000.00  1.0    58000.0
    2    70,000.00  1.0    70000.0
    3        17550  1.0    17550.0
    4        34693  1.0    34693.0
    5        15674  0.4     6269.6

【讨论】:

  • 我以前也使用过 .mul 方法,但不幸的是,我遇到了同样的问题。
  • @SyLviA 我无法复制您的错误。你用的是什么版本的 python 和 pandas?
  • python: 3.7.3, pandas: 0.25.1 我正在使用 jupyter Notebook 6.0.0 @Alexander
  • 我认为问题在于ActualSalary 列最初是整数和字符串的混合。首先尝试将其转换为字符串,然后按上述方式继续,即。 df['ActualSalary'].astype(str).str.replace(',', '').astype(float).mul(df['FTE'])
  • 非常感谢@Alexander,解决了这个问题!!整个必须将其转换为字符串,然后继续使用我的原始代码!我很高兴,但是我不明白如果它是混合物,为什么我必须先将它转换成字符串?再次感谢您!
猜你喜欢
  • 2018-01-24
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 2013-11-03
  • 2022-01-23
相关资源
最近更新 更多