我有一个数据框:
df = pd.DataFrame({'a':[1,2,3], 'b':['2017/01/01', '2017/01/02','2016/12/31'], 'c':['aaa', 'bbb', 'ccc'], 'd':[4,5,6]})
我有一份格式化程序列表:
formatter = [4.2, '%Y%m%d', None, 8.2]
我想将a列格式化为float'4.2f',将b格式化为strftime('%Y%m'),将c格式化为原样(字符串,无需格式化),将列d格式化为float' 8.2f”。如何将此格式化程序列表传递给dataframe df?
谢谢,
答案 0 :(得分:3)
如果您从格式化程序列表切换到基于列的地图,则可以在数据框上使用style.format
。
像
这样的东西import pandas as pd
import datetime
def time_formatter(data):
return datetime.datetime.strptime(data, "%Y/%m/%d").date().strftime('%Y%m%d')
df = pd.DataFrame({'a':[1,2,3], 'b':['2017/01/01', '2017/01/02','2016/12/31'], 'c':['aaa', 'bbb', 'ccc'], 'd':[4,5,6]})
formatter = {'a':'{:4.2f}', 'b': time_formatter, 'd':'{:8.2f}'}
df.style.format(formatter)
将输出
a b c d
0 1.00 20170101 aaa 4.00
1 2.00 20170102 bbb 5.00
2 3.00 20161231 ccc 6.00
修改强>
必须有一种更清洁的方式,但实际使用您可以执行以下操作的格式更新数据框:
df['a'] = df['a'].map('{:4.2f}'.format)
df['d'] = df['d'].map('{:8.2f}'.format)
df['b'] = df['b'].map(time_formatter)
或者更通用(和神秘)的方式:
formatter = {'a':'{:4.2f}'.format, 'b': time_formatter, 'd':'{:8.2f}'.format}
for f in formatter.items():
column = f[0]
df[column] = df[column].map(f[1])