2017-07-05 69 views
1

從每日報告,我使用:熊貓:將表示數字,用字符的字符串,成浮點/ INT

pd.read_csv(filepath, sep = '\t') 

打開一個數據幀看上去像下面(以簡化格式):

finalDf2 = pd.DataFrame(dict(
      Portfolio = pd.Series(['Book1', 'Book1', 'Book2', 'Book3', 'Book1','Book1']), 
      Strike = pd.Series(['108','109.10', '111', '114', '108.3', '115.0']), 
      Notional = pd.Series(['0', '-0.02', '35', '. 3K', '-0.05K', '0' ])) 
    ) 

通過的「名義」欄下的各個條目運行以下:

type(finalDf2.iloc[ , ] 

我看到的是0型int已經。
但是非零值是字符串。我試圖通過使用到字符串轉換成浮動:

finalDf2['Notional'].astype(float) 

但在這樣做之前,我怎麼能轉換包含「K」值的所有單元格?例如,

。 3K應該最終成爲浮點數或整數0
-0。 05K應該最終被浮動或整數-50

間距實際上在文件中,因此不幸的是數據幀。

+0

替換ķ是否在十進制值的額外空間表示一個0?那麼「.3」代表「.03」? – FLab

+0

'。 3K最終應該是float或int 30; -0。 05K最終應該是float或者int -50'這兩行相互矛盾。應該將空間轉換爲'0'或'''' –

回答

1

這裏是一個可能的解決方案:

def notional_to_num(x): 
    if isinstance(x, (int, float)): 
     return x 
    elif isinstance(x, str): 
     return x if 'K' not in x else float(x.replace(" ", "0")[:-1])*1e3 
    else: 
     raise 

finalDf2.loc[:, 'Notional'] = finalDf2['Notional'].apply(notional_to_num) 

這給下面的輸出:

Notional Portfolio Strike 
0  0  Book1  108 
1 -0.02  Book1 109.10 
2  35  Book2  111 
3  30  Book3  114 
4  -50  Book1 108.3 
5  0  Book1 115.0 
+0

謝謝FLab。我使用了上面第一個使用約翰的答案: finalDf2 ['colName1'] = finalDf2 ['colName1']。str.replace('','0') ... finalDf2 ['colName9'] = finalDf9 ['colName9']。str.replace('','0') 到各個列。這是爲了擺脫時期後的任何空間。 然後使用: finalDf.fillna(value = 0,inplace = True) 將NaN轉換爲0。 最後稍微修改你的函數來處理另一個異常(我的實際數據框有一些隨機的條目**),並將它應用到各個列以獲得更清潔的df。 –

+0

很高興幫助!如果您發現有用的答案,請不要忘記投票/接受,或上傳您的答案,以便其他人可以使用 – FLab

0

首先,替代空間。

In [344]: s = finalDf2['Notional'].str.replace(' ', '0') 

然後,提取數值部分,和「K」的一部分,以1000

In [345]: (s.str.extract(r'(-?[\d\.]+)', expand=False).astype(float) * 
      s.str.extract(r'([K]+)', expand=False).replace([np.nan, 'K'], [1, 1000])) 
Out[345]: 
0  0.00 
1 -0.02 
2 35.00 
3 30.00 
4 -50.00 
5  0.00 
Name: Notional, dtype: float64 
+0

謝謝John。我使用了第一部分。 第二部分在我的實際數據框上產生了一個錯誤,因爲我認爲: 「無法將字符串轉換爲浮點數:'。' 「 –