重命名熊猫数据框中的多个列,通过重命名它可能会意外地创建具有相同名称的列

时间:2017-05-09 21:56:44

标签: python pandas dataframe

我在python中有一个带有这些标题的数据框

GP  2016-Dec    2017-Jan    2017-Feb    2017-Mar    2017-Apr    2017-May    2017-Jun    2017-Jul    2017-Aug    2017-Sep    2017-Oct    2017-Nov

我希望将其更改为

GP     2017-Jan    2017-Feb    2017-Mar    2017-Apr    2017-May    2017-Jun    2017-Jul    2017-Aug    2017-Sep    2017-Oct    2017-Nov    2017-Dec

所以我创建了一个数组,其中包含我要替换的日期

new_date = [u'2017-Jan', u'2017-Feb', u'2017-Mar', u'2017-Apr', u'2017-May', u'2017-Jun', u'2017-Jul', u'2017-Aug', u'2017-Sep', u'2017-Oct', u'2017-Nov', u'2017-Dec']

和旧日期的数组

old_date = Index([u'2016-Dec', u'2017-Jan', u'2017-Feb', u'2017-Mar', u'2017-Apr',
   u'2017-May', u'2017-Jun', u'2017-Jul', u'2017-Aug', u'2017-Sep',
   u'2017-Oct', u'2017-Nov'],
  dtype='object')

然后进行一个循环,逐个更改每一列。

j = 0
for i in new_date:
     print old_date[j] + ' : ' + i
     df.rename(columns={old_date[j]  :  i}, inplace=True)
     j = j + 1

,最终结果是

GP  2017-Dec    2017-Dec    2017-Dec    2017-Dec    2017-Dec    2017-Dec    2017-Dec    2017-Dec    2017-Dec    2017-Dec    2017-Dec    2017-Dec

所以,我的周期不起作用的原因是因为当我重命名我的第一列" 2016-Dec"到" 2017-Jan",新数据框将如下所示

GP  2017-Jan    2017-Jan    2017-Feb    2017-Mar    2017-Apr    2017-May    2017-Jun    2017-Jul    2017-Aug    2017-Sep    2017-Oct    2017-Nov

它将有两列名称" 2017-Jan"然后下一个循环开始,程序将重命名名称为" 2017-Jan"的所有列。到" 2017-Feb" ......等等。

所以真正的问题是我不知道如何修复它,或者是否有更直接的方法可以立即更改所有列。希望有人能让我高兴!谢谢!

2 个答案:

答案 0 :(得分:0)

假设您的dataframe被称为df,请尝试以下操作:

from dateutil.relativedelta import relativedelta

df.columns = [(pd.to_datetime(df.columns[i]) + relativedelta(months=1)).strftime(format="%Y-%b") for i in range(0, len(df.columns))]

基本上代码的作用是在列索引的各个元素上循环,并且每个元素执行以下操作:

  1. 将您的字符串转换为datetime
  2. 为您的datetime
  3. 添加1个月
  4. 以您想要的格式(string
  5. 转换回"%Y-%b"

答案 1 :(得分:0)

而不是每次在for循环中重命名列。你可以建立一个映射旧日期和新日期的字典,然后使用该字典重命名。请参阅下面的示例

old_date =[u'2016-Dec', u'2017-Jan', u'2017-Feb']
df = pd.DataFrame.from_records([(1,2,3)],columns = old_date)
print df
'''
   2016-Dec  2017-Jan  2017-Feb
0         1         2         3
'''

new_date = [u'2017-Jan', u'2017-Feb', u'2017-Mar']
map_dict = {}
for o,n in zip(old_date,new_date):
    map_dict[o] = n

print map_dict
'''
{u'2016-Dec': u'2017-Jan', u'2017-Jan': u'2017-Feb', u'2017-Feb': u'2017-Mar'}
'''

df.rename(columns=map_dict, inplace=True)
print df

'''
      2017-Jan  2017-Feb  2017-Mar
0         1         2         3
'''