我有以下系列:
Period Ending
0 7/2017
1 4/2017
2 1/2017
3 10/2016
4 7/2016
5 4/2016
我想将月份转换为更少的选项(称为季度)。
对于这个操作,我建了一个字典:
period_dict = {3: [1,2,3], 6:[4,5,6], 9:[7,8,9], 12:[10,11,12]}
键是四分之一,值是几个月。
我的想法是,如果pandas列中的月份值在字典值(列表)中,则使用键值替换它。
输出应如下所示:
NEW Period Ending
0 9/2017
1 6/2017
2 3/2017
3 12/2016
4 9/2016
5 6/2016
我做了很多研究但是所有内容都指向匹配一个键并用一个字典值替换。
此外:
Python Pandas: How to replace a characters in a column of a dataframe?
从概念上讲,我提出的最接近的是:
for k, v in period_dict.items():
if table['Period Ending'] in v:
table['Period Ending'].replace([i[0] for i in table['Period Ending']],k)
我得到了
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我很感激任何想法。
编辑1
作为解决方案的一部分,我能够隔离'月份字符串,但仍然不知道如何使用字典转换它。
print 'GET Month String'
''' Split date con / '''
# de https://stackoverflow.com/questions/27387415/how-would-i-get-everything-before-a-in-a-string-python
split_df = tabla['Period Ending'].astype(str).str.split('/')
split_date = split_df.str[0]
print split_date
print
输出:
GET Month String
0 7
1 4
2 1
3 10
4 7
5 4
答案 0 :(得分:3)
这是单程
使用<asp:LinkButton runat="server" ID="lnkAddDip" OnClick="lnkAddDip_Click" OnClientClick="getURL()">
将值替换为键,将值替换为最终组
new_map
拆分月份和年份
In [3998]: new_map = {str(x): str(k) for k, v in period_dict.iteritems() for x in v}
在In [3999]: dff = df['Period Ending'].str.split('/', expand=True)
映射上使用map
月份系列,然后加入年度系列
new_map
或者,使用In [4000]: dff[0].map(new_map) + '/' + dff[1]
Out[4000]:
0 9/2017
1 6/2017
2 3/2017
3 12/2016
4 9/2016
5 6/2016
dtype: object
apply
详细
In [4009]: df['Period Ending'].str.split('/', expand=True).apply(
lambda x: new_map[x[0]] + '/' + x[1], axis=1)
Out[4009]:
0 9/2017
1 6/2017
2 3/2017
3 12/2016
4 9/2016
5 6/2016
dtype: object
答案 1 :(得分:3)
这是一种使用日期时间功能的方法。将月份转换为季度,然后解析为几个月。
df['Period Ending'] = pd.PeriodIndex(pd.to_datetime(df['Period Ending']), freq='Q')\
.strftime('%m/%Y')
你得到了
Period Ending
0 09/2017
1 06/2017
2 03/2017
3 12/2016
4 09/2016
5 06/2016