這是一個非常幼稚的問題,但在參考了多篇文章后,我提出了這個擔憂。我在資料集中有一列,該列具有numeric/blank/null值。我有如下資料:
fund_value
Null
123
-10
我寫了一個方法來處理它,但它不起作用并不斷給我錯誤:
def values(x):
if x:
if int(x) > 0:
return 'Positive'
elif int(x) < 0:
return 'Negative'
else:
return 'Zero'
df2 = pd.read_csv('/home/siddhesh/Downloads/s2s_results.csv') # Assuming it as query results
df2 = df2.astype(str)
df2['fund_value'] = df2.fund_value.apply(values)
Error:
Traceback (most recent call last):
File "/home/../Downloads/pyspark/src/sample/actual_dataset_testin.py", line 31, in <module>
df2['fund_value'] = df2.fund_value.apply(values)
File "/home/../.local/lib/python3.8/site-packages/pandas/core/series.py", line 4357, in apply
return SeriesApply(self, func, convert_dtype, args, kwargs).apply()
File "/home/../.local/lib/python3.8/site-packages/pandas/core/apply.py", line 1043, in apply
return self.apply_standard()
File "/home/../.local/lib/python3.8/site-packages/pandas/core/apply.py", line 1099, in apply_standard
mapped = lib.map_infer(
File "pandas/_libs/lib.pyx", line 2859, in pandas._libs.lib.map_infer
File "/home/../Downloads/pyspark/src/sample/actual_dataset_testin.py", line 16, in values
if int(x) > 0:
ValueError: invalid literal for int() with base 10: 'nan'
我什至嘗試過if x=="",if not x:但沒有任何效果。
Expected Output:
fund_value
Zero
Positive
Negative
uj5u.com熱心網友回復:
考慮 df 為:
In [1278]: df = pd.DataFrame({'fund_value': [np.nan, 123, '', 10]})
In [1279]: df
Out[1279]:
fund_value
0 NaN
1 123
2
3 10
numpy.select與 一起使用pd.to_numeric:
In [1246]: import numpy as np
In [1283]: df['fund_value'] = pd.to_numeric(df.fund_value, errors='coerce')
In [1247]: conds = [df.fund_value.gt(0), df.fund_value.lt(0)]
In [1250]: choices = ['Positive', 'Negative']
In [1261]: df['fund_value'] = np.select(conds, choices, default='Zero')
In [1288]: df
Out[1288]:
fund_value
0 Zero
1 Positive
2 Zero
3 Positive
uj5u.com熱心網友回復:
您正面臨與 的NaN支持問題int。那是行不通的事情...
您的解決方案:使用 . 填充您的“缺失”值pd.fillna()。用某些東西(例如,用0)填充這些值,或洗掉它們。只需讀取float具有本機NaN支持的值,然后填充或洗掉那些NaN
背景:您首先將列轉換為str,然后在您的檢查函式中將其轉換回int,這會給您一個NaN錯誤,這似乎是一種解決方法......這是導致問題的原因:直接讀取int不起作用,int看不懂NaN-->Int用大寫的I
示例:假設您有一個 'dirty int' 輸入,其中包括NaN,像這樣
df = pd.DataFrame({'fund_value': [None, 123, 10]})
fund_value
0 NaN
1 123.0
2 10.0
float鑒于所有值都是數字,Pandas 會禮貌地將其轉換為,None并np.nan用NaN. 你有一些東西要篩選,但實際上它是一列float,而不是int。
選項 1:如何將NaN值“轉換”為“0”整數(根據您的情況區分“正”或“負”)
df.fillna(0).astype('int')
選項 2:直接將具有NaN值的列轉換為Int:
df.astype('Int32')
然后,您可以使用其中一個真正包含整數的資料集(選項 1 假設所有NaN==0,第二個具有 true <NA>,not floats)
uj5u.com熱心網友回復:
您df2.astype(str)將所有內容都轉換為字串,并且當您應用于values(...)所有字串的列的內容時,第一個if-check 只會回傳您 aFalse如果它是一個空字串,而str(np.nan). 轉換np.nan成字串會給你一個非空的字串'nan'。
'nan'將通過您的第一個if-check,然后在第二個if-check 中,它發現自己無法轉換為 anint并且 python 回傳一個錯誤。
為了解決這個問題,
x = df['fund_value'].replace('', np.nan).astype(float)
(x > 0).map({True: 'Positive'}).fillna( (x < 0).map({True: 'Negative'}) ).fillna('Zero')
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/424774.html
