Pandas =如果词典值在字典值中,则用字典键替换列值(列表)

时间:2017-09-26 17:14:48

标签: python-2.7 pandas dictionary

我有以下系列:

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

我做了很多研究但是所有内容都指向匹配一个键并用一个字典值替换。

  

Remap values in pandas column with a dict

此外:

  

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

2 个答案:

答案 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