问题
有没有办法只格式化特定的数据框?
我已经看过格式化单个数据帧的特定列的示例(示例1)或将整个pandas库设置为默认选项(示例2)。但是,我还没有看到格式化特定数据框的选项,而没有明确列出每一列。
设置
import pandas as pd
import numpy as np
# Setup first example
data = np.random.random((3,4))
df = pd.DataFrame(data)
print df
# 0 1 2 3
#0 0.384326 0.364187 0.084034 0.012376
#1 0.114784 0.298068 0.087634 0.828207
#2 0.255923 0.438617 0.820652 0.266964
示例1 - 更改单个数据框中特定列的格式
df[3] = df[3].map('${:,.2f}'.format)
print df
# 0 1 2 3
#0 0.384326 0.364187 0.084034 $0.01
#1 0.114784 0.298068 0.087634 $0.83
#2 0.255923 0.438617 0.820652 $0.27
示例2 - 更改所有pandas数据帧(包括新数据帧)的格式
pd.options.display.float_format = '${:,.2f}'.format
print(df)
# 0 1 2 3
#0 $0.38 $0.36 $0.08 $0.01
#1 $0.11 $0.30 $0.09 $0.83
#2 $0.26 $0.44 $0.82 $0.27
data2 = np.random.random((4,3))
df2 = pd.DataFrame(data2)
print df2
# 0 1 2
#0 $0.60 $0.37 $0.86
#1 $0.28 $0.06 $0.97
#2 $0.19 $0.68 $0.99
#3 $0.06 $0.88 $0.82
我一直在寻找像示例2这样的选项,但它不会将格式应用于未来的数据帧。谢谢!
编辑 - 道歉,我应该更清楚格式化。示例1更改了数据类型,而示例2没有。我希望不必在数据类型之间进行转换(如果可能)。例如。第一个示例从浮点数更改为非空对象:
df.info()
#<class 'pandas.core.frame.DataFrame'>
#Int64Index: 3 entries, 0 to 2
#Data columns (total 4 columns):
#0 3 non-null float64
#1 3 non-null float64
#2 3 non-null float64
#3 3 non-null object
#dtypes: float64(3), object(1)
答案 0 :(得分:5)
我认为您最好的选择是将格式化程序传递给to_string
In [283]: print df.to_string(float_format='${:,.2f}'.format)
0 1 2 3
0 $0.53 $0.01 $0.75 $0.61
1 $0.54 $0.33 $0.42 $0.47
2 $0.28 $0.67 $0.71 $0.53
虽然这不会与数据帧保持一致。你可以做这样的猴子补丁。
In [286]: from functools import partial
In [287]: df.to_string = partial(df.to_string, float_format='${:,.2f}'.format)
In [288]: print df
0 1 2 3
0 $0.53 $0.01 $0.75 $0.61
1 $0.54 $0.33 $0.42 $0.47
2 $0.28 $0.67 $0.71 $0.53
答案 1 :(得分:2)
如何像这样循环遍历列:
for i in range(len(df.columns)):
df[i] = df[i].map('${:,.2f}'.format)
或只是:
df.applymap('${:,.2f}'.format)