2017-05-21 40 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。 –