熊猫:按CSV文件中的列表对行进行分组?

时间:2020-02-25 15:32:20

标签: regex python-3.x pandas

为了使我们的预算工作更加轻松并帮助自己学习;我正在用python创建一个小程序,该程序从我们的导出银行csv中获取数据。

我将举例说明我要如何处理这些数据。假设我想将所有快餐费用归为一类。 “描述”列中有许多名称不同且总数不同的名称,但我希望将它们全部列为一项“快餐”费用。

例如,Csv的设置如下:

Date             Description           Debit    Credit
1/20/20      POS PIN BLAH BLAH ###     1.75      NaN

我想出了如何用or语句对它们进行分组:

contains = df.loc[df['Description'].str.contains('food court|whataburger', flags = re.I, regex = True)]

我最终希望从列表中读取它?我想将所有费用归类,并检查那些类别变量名称,以便仅从该列表中输出。

我尝试过类似的事情:

fast_food = ['Macdonald', 'Whataburger', 'pizza hut']

那显然是行不通的。

如果有更好的方法可以这样做,我欢迎您提出建议。

此外,我在堆栈中浏览了很多文章,但尚未找到答案(尽管我确定我忽略了它)

任何帮助将不胜感激。我还在学习。

谢谢

2 个答案:

答案 0 :(得分:1)

使用动态模式构建:

\b

re.escape单词边界找到整个单词,而不是部分单词。

\b将保护特殊字符,它们将被解析为文字字符。

如果public class Document { public string Id { get; set; } } 对您不起作用,请通过Match a whole word in a string using dynamic regex检查其他方法

答案 1 :(得分:1)

您可以先使用str.extract然后再使用groupby分配新列:

df = pd.DataFrame({"description":['Macdonald something', 'Whataburger something', 'pizza hut something',
                                  'Whataburger something','Macdonald something','Macdonald otherthing',],
                   "debit":[1.75,2.0,3.5,4.5,1.5,2.0]})

fast_food = ['Macdonald', 'Whataburger', 'pizza hut']

df["found"] = df["description"].str.extract(f'({"|".join(fast_food)})',flags=re.I)

print (df.groupby("found").sum())

#
             debit
found             
Macdonald     5.25
Whataburger   6.50
pizza hut     3.50