pandas DataFrame / Series值格式问题

时间:2017-05-21 09:40:04

标签: python pandas

让我举个例子:

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

说,我想选择一行列' a' == 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只有一行。

现在,当我尝试格式化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的值。

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

我理解这是因为df1DataFramedf1['a']Series,但是参数传递给format()函数期待别的东西 而不是Series个对象。所以我试着绕着这个笨拙地走来走去:

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

无论如何,这里的效率和pythnoic更高效吗?

1 个答案:

答案 0 :(得分:1)

如果要将数据类型更改为str,可以使用:

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

结果print(df)

   a  b
0  0  1

数据类型print(df.dtypes)

a    object
b    object
dtype: object

如果要应用字符串格式,可以使用:

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