2017-05-21 38 views
1

讓我舉一個例子:大熊貓據幀/系列值格式問題

df = pd.DataFrame(np.arange(6).reshape(3, 2), columns=list('ab')) 
print(df) 

    a b 
0 0 1 
1 2 3 
2 4 5 

說,我要選擇與列「一」 == 0一排,我知道,在我的數據幀,有隻有一行滿足這個條件。

df1 = df.loc[df['a'] == 0] 
print(df1) 
    a b 
0 0 1 
type(df1) 
pandas.core.frame.DataFrame 

df2 = df.loc[0] 
print(df2) 
a 0 
b 1 
Name: 0, dtype: int32 
type(df2) 
pandas.core.series.Series 

正如你所看到的,df1DataFrame實例,但df2Series,雖然df1只有一行。

print('{:.2f}'.format(df1['a'])) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-92-62c2a3e8dbc0> in <module>() 
----> 1 print('{:.2f}'.format(df1['a'])) 

TypeError: unsupported format string passed to Series.__format__ 

,但它的確定要打印的df2值:

現在,當我嘗試格式化的df1值出現問題。

print('{:.2f}'.format(df2['a'])) 
0.00 

據我所知,這是因爲df1DataFramedf1['a']將是一個Series,但傳遞給format()函數的參數預計比Series對象以外的東西 。所以我試圖走動這個笨拙的:

print('{:.2f}'.format(df1['a'].values[0])) 
0.00 

有沒有反正這是更有效率和pythnoic在這裏?

+0

你們是不是要格式化所有值作爲字符串?或轉換爲浮動? –

回答

0

如果要更改數據類型str,你可以使用:

df = df[df['a'] == 0].astype(str) 

結果print(df)

a b 
0 0 1 

數據類型print(df.dtypes)

a object 
b object 
dtype: object 

我F你要應用一個字符串格式,你可以使用:

df = df[df['a'] == 0].applymap('{:,.2f}'.format) 

結果print(df)

 a  b 
0 0.00 1.00 

數據類型print(df.dtypes)

a object 
b object 
dtype: object 

下一個解決方案不會改變數據。

pattern = '{:,.2f}'.format 
print df.to_string(formatters={'a': pattern, 'b': pattern}) 

輸出:

 a b 
0 0.00 1.00 
1 2.00 3.00 
2 4.00 5.00 
+0

謝謝。這只是我從另一個數據框中選擇了幾個選定的一行數據幀,我想用兩位小數打印出數值。不打算改變dtypes。 – StayFoolish

+0

@StayFoolish,我添加了第三個版本,它不改變dtypes。 –