Python 使用字典中的正则表达式从事务列创建类别列

Python 使用字典中的正则表达式从事务列创建类别列,python,regex,dictionary,pandas,Python,Regex,Dictionary,Pandas,我有一个csv文件,其中包含作为数据框导入的银行信息。我想创建一个包含交易类别(例如收入、费用、转账)的新列,该列是从包含正则表达式的字典创建的,以应用于交易描述 比如说, import pandas as pd import re data = pd.read_csv("data/transactions.csv", parse_dates=['Date']) 以下是数据数据帧的输出: Date Description Amount 201

我有一个csv文件,其中包含作为数据框导入的银行信息。我想创建一个包含交易类别(例如收入、费用、转账)的新列,该列是从包含正则表达式的字典创建的,以应用于交易描述

比如说,

import pandas as pd
import re

data = pd.read_csv("data/transactions.csv", parse_dates=['Date'])
以下是
数据
数据帧的输出:

      Date                  Description   Amount
2016-01-01          checkcard good food   -12.45
2016-01-02              visa peppy lube   -30.34
2016-01-05           deposit bank of me  5000.00
2016-01-05             transfer to bank  2500.00
2016-01-10         gift from aunt sally    25.00
以下是正则表达式:

income = re.compile('.*deposit|gift.*')
expense = re.compile('good food|.*peppy lube.*')
transfer = re.compile('.*transfer.*')
这是字典:

catdict = {income: 'income',
           expense: 'expense',
           transfer: 'transfer'}
我需要创建名为
Category
的新列的代码,该列使用正则表达式将字典的值分配给
Description
列与其中一个正则表达式匹配的行,因此结果将是:

      Date                  Description   Amount  Category
2016-01-01          checkcard good food   -12.45   expense 
2016-01-02              visa peppy lube   -30.34   expense
2016-01-05           deposit bank of me  5000.00    income
2016-01-05             transfer to bank  2500.00  transfer
2016-01-10         gift from aunt sally    25.00    income
理想情况下,对于正则表达式中找不到匹配项的行,此代码还将在“类别”列中插入“协调”

我是python新手,我怀疑我缺少一种python式的方法来实现这一点


提前感谢

您可以定义一个函数,根据您的
正则表达式将字符串(描述)映射到类别。第一次匹配模式时,函数返回该类别的名称。如果没有匹配项,则返回“协调”

from collections import OrderedDict

def category(s):

    catdict = OrderedDict([(income, 'income'),
                          (expense, 'expense'),
                          (transfer, 'transfer'),
                          ])
    for ptn, name in catdict.iteritems():
        if ptn.search(s):
            return name
    return 'RECONCILE'
然后您可以将此函数应用于“描述”列

data['Category'] = data.Description.map(category)

print data

这会给你你想要的

对于重叠的类别,应如何处理?例如,sally阿姨送的礼物(优惠券)可以和她一起去这里吃饭吗?问得好。也许可以通过将最高优先级的类别放在字典的第一位来构建优先级排序?不幸的是,
dict
没有排序。您需要
OrderedDict
来完成此操作。