熊猫改变数据格式od长列

时间:2018-04-15 03:33:11

标签: pandas

我正在抛光我的代码。在某一点上,我想将以字符串形式给出的日期转换为另一个包含相同日期但以不同格式显示的字符串。 每个日期之后都有代码,对于给定的日期总是相同的代码。

这是我的df:

import pandas as pd
data = ['2012-06-29 A','2012-08-29 B','2012-10-29 X','2012-10-15 A']*50000
data.sort()
df = pd.DataFrame({'A':data})
  • A
  • 2012-06-29 A
  • 2012-06-29 A
  • 2012-06-29 A
  • 2012-06-29 A
  • 2012-06-29 A

以下是我现在正在做的事情:

df['A'] = df['A'].apply(lambda x: pd.to_datetime(x.split(' ')[0]).strftime('%d %b %Y ') + x.split(' ')[1]) 
  • A
  • 2012年6月29日A
  • 2012年6月29日A
  • 2012年6月29日A
  • 2012年6月29日A
  • 2012年6月29日A

它工作正常,但它似乎制造了瓶颈(实际上它不仅仅是数据准备的一部分)。

可以更好/更快地完成吗?

对于1 df(以及许多dfs),我总共有大约15个这样的日期。我想知道是否从唯一日期创建dict或临时support_df并通过lambda以某种方式(如何?)应用这些以避免多次转换。

其他信息(可能有用):后面的A列成为MultiIndex的一部分。

1 个答案:

答案 0 :(得分:1)

IIUC,我的第一次尝试是这种方法:

无需申请数据框:

(pd.to_datetime(df['A'].str.split().str[0]).dt.strftime('%d %b %Y') + ' '
                + df['A'].str.split().str[1])

第二次尝试使用列表推导而不是.str访问器:

(pd.to_datetime(pd.Series([i.split()[0] for i in df.A])).dt.strftime('%d %b %Y') 
            + ' ' + pd.Series([i.split()[1] for i in df.A]))

第三次尝试:

ls = [i.split() for i in df.A]
i,j = zip(*ls)
pd.Series(pd.to_datetime(i).strftime('%d %b %Y')) + ' ' + pd.Series(j)