2016-11-27 56 views
0

這是針對this的後續問題。使用熊貓風格將數千個分隔符添加到具有空字符串的數據框中

使用熊貓風格,我設法將數據框中的所有值格式化爲包含千位分隔符逗號的值。但是,如果數據框中有空字符串,則格式化失敗。

基本上,我的目標是從這個轉換:enter image description here這樣:enter image description here

誰能幫助我?

這是我到目前爲止的代碼:

import pandas as pd 
from IPython.display import HTML 

styles = [ 
    hover(), 
    dict(selector = "th", 
     props = [("font-size", "110%"), 
        ("text-align", "left"), 
        ("background-color", "#cacaca") 
       ] 
     ) 
    ] 

column_01 = ["", 2000000000, "", 21000000, 3000] 
df = pd.DataFrame(column_01) 

int_frmt = lambda x: "{:,}".format(x) # Integer 
float_frmt = lambda x: "{:,.0f}".format(x) if x > 1e3 else "{:,.2f}".format(x) # Float 
str_frmt = lambda x: "{:}".format(x) # <----- Added for empty strings but fails 
frmt_map = {np.dtype("int64"): int_frmt, 
      np.dtype("float64"): float_frmt, 
      np.dtype("S"): str_frmt # <----- Added for empty strings but fails 
      } 
frmt = {col: frmt_map[df.dtypes[col]] for col in df.columns if df.dtypes[col] in frmt_map.keys()} 

html = (df.style.set_table_styles(styles).format(frmt)) 

html 

回答

1

使用NumPy的,你可以創建一個函數來進行轉換,並vectorize()它。如下這可以被應用到您的數據幀:

import numpy as np 

def thousands(x): 
    try: 
     return '{:,}'.format(int(x)) 
    except ValueError as e: 
     return x 

data = np.array(["","2000000000", "", "21000000", "3000"]) 
f_thousands = np.vectorize(thousands) 
print f_thousands(data) 

給你:

['' '2,000,000,000' '' '21,000,000' '3,000']  

這試圖進入到一個整數轉換,然後用格式的千位分隔符。如果轉換失敗,它將不變地返回傳入的條目,例如空白

另請參閱Python的Format Specification Mini-Language以獲取更多信息。


使用熊貓,可以這樣做如下:

import pandas as pd 

def thousands(x): 
    try: 
     return '{:,}'.format(int(x)) 
    except ValueError as e: 
     return x 

data = pd.DataFrame(["","2000000000", "", "21000000", "3000"]) 
print data.applymap(thousands) 

給你:

   0 
0    
1 2,000,000,000 
2    
3  21,000,000 
4   3,000 
+0

嗨馬丁。你的代碼是否也在'IPython.display Html'中工作? – Fxs7576