Skip to main content
 首页 » 编程设计

python之如果列值是数字,Pandas 会将一列中的值与另一列相乘吗

2025年05月04日23落叶

我无法理解如何更正此问题

c_df 
 
   lotsize strike_lots amt_cvr 
0  75.0     1.0         1.0    
1  2500.0   N           943845 
2  100.0    N           742350 
3  600.0    2.0         2.0    
4  8000.0   N           585214 
5  3500.0   N           838704 
6  6000.0   2.0         2.0    
7  4000.0   N           709020 
8  1500.0   N           263610 
 
c_df.loc[c_df['strike_lots'] != 'N', 'amt_cvr'] = float(c_df['strike_lots'])*c_df['lotsize'] 

我检查了dtypes

lotsize        float64 
strike_lots    object  
amt_cvr        object  
dtype: object 

我假设的问题是 strike_lots 的 dtype,我不想更改它,因为我想保留 N 值。

Traceback (most recent call last): 
  File "/media/sid1/sid/lib/python3.6/site-packages/pandas/core/ops.py", line 1012, in na_op 
    result = expressions.evaluate(op, str_rep, x, y, **eval_kwargs) 
  File "/media/sid1/sid/lib/python3.6/site-packages/pandas/core/computation/expressions.py", line 205, in evaluate 
    return _evaluate(op, op_str, a, b, **eval_kwargs) 
  File "/media/sid1/sid/lib/python3.6/site-packages/pandas/core/computation/expressions.py", line 65, in _evaluate_standard 
    return op(a, b) 
TypeError: can't multiply sequence by non-int of type 'float' 
During handling of the above exception, another exception occurred: 
Traceback (most recent call last): 
  File "/media/sid1/sid/lib/python3.6/site-packages/pandas/core/ops.py", line 1033, in safe_na_op 
    return na_op(lvalues, rvalues) 
  File "/media/sid1/sid/lib/python3.6/site-packages/pandas/core/ops.py", line 1018, in na_op 
    result[mask] = op(x[mask], com._values_from_object(y[mask])) 
TypeError: can't multiply sequence by non-int of type 'float' 
During handling of the above exception, another exception occurred: 
Traceback (most recent call last): 
  File "<input>", line 1, in <module> 
  File "/media/sid1/sid/lib/python3.6/site-packages/pandas/core/ops.py", line 1069, in wrapper 
    result = safe_na_op(lvalues, rvalues) 
  File "/media/sid1/sid/lib/python3.6/site-packages/pandas/core/ops.py", line 1037, in safe_na_op 
    lambda x: op(x, rvalues)) 
  File "pandas/_libs/algos_common_helper.pxi", line 1212, in pandas._libs.algos.arrmap_object 
  File "/media/sid1/sid/lib/python3.6/site-packages/pandas/core/ops.py", line 1037, in <lambda> 
    lambda x: op(x, rvalues)) 
TypeError: ufunc 'multiply' did not contain a loop with signature matching types dtype('<U32') dtype('<U32') dtype('<U32') 

预期输出

c_df 
 
   lotsize strike_lots amt_cvr 
0  75.0     1.0         75.0    #this value changes   
1  2500.0   N           943845 
2  100.0    N           742350 
3  600.0    2.0         1200.0   #This value changes    
4  8000.0   N           585214 
5  3500.0   N           838704 
6  6000.0   2.0         12000.0 #This value changes   
7  4000.0   N           709020 
8  1500.0   N           263610 

提前致谢。

请您参考如下方法:

您可以使用to_numeric 和fillna

df['amt_cvr'] = (df['lotsize']*pd.to_numeric(df['strike_lots'],errors='coerce')).fillna(df['amt_cvr']) 
 
   lotsize strike_lots   amt_cvr 
0     75.0         1.0      75.0 
1   2500.0           N  943845.0 
2    100.0           N  742350.0 
3    600.0         2.0    1200.0 
4   8000.0           N  585214.0 
5   3500.0           N  838704.0 
6   6000.0         2.0   12000.0 
7   4000.0           N  709020.0 
8   1500.0           N  263610.0 

pd.to_numeric(df['strike_lots'],errors='coerce') 会将非数值转换为 NaN。因此,当您将它与数字列相乘时,其输出也将是 NaN。

然后我们可以使用 fillna 用实际的 amt_cvr 填充空值。希望能帮助到你。