【问题标题】:Group dataframe by similar rows按相似行对数据框进行分组
【发布时间】:2022-01-13 08:23:15
【问题描述】:

我有一个 Excel 文件,其中包含需要按相同概念分组的费用。为简单起见,数据框应该是这样的:

Date Concept Amount
07-12-2021 A 01 -100
01-12-2021 A 02 -150
30-11-2021 B 01 -50
29-11-2021 C 01 -25
23-11-2021 D 01 -70
22-11-2021 C 02 -80
19-11-2021 B 02 -65
18-11-2021 B 03 -25
17-11-2021 A 03 -30
16-11-2021 D 02 -120

概念“A 0X”,指的是相同的通用概念“A”,但它有不同的标识符。 请记住,“A 0X”概念是为了简单起见,但该概念将是一个更复杂的表达方式

我正在尝试使用此代码按相同的概念进行分组:

import pandas as pd
df = pd.read_excel("Expenses.xlsx")
df.groupby('Concept')['Amount'].apply(list)

问题在于,使用此代码,我无法将所有概念“A0X”、“B0X”、“C0X”归为相同的一般概念“A”、“B”或“C”。

我需要的最终结果是:

总费用

Concept Amount
A 280
B 140
C 105
D 190

我需要知道如何使用正则表达式实现 groupby 方法。

【问题讨论】:

  • 请提供数据作为实际文本而不是图像。
  • 您是否尝试过使用正则表达式(import re) - 如何将正则表达式与熊猫一起使用的示例stackoverflow.com/questions/28495905/…>
  • @sunnytown 我已经把数据放到表格里了

标签: python excel regex dataframe pandas-groupby


【解决方案1】:

如果要按Concept列的第一个字母进行分组,可以使用groupby中的pandas字符串函数。

df_total = df.groupby(df['Concept'].str.split(' ').str[0]).sum().reset_index()

这会返回:

>>> df_total
    Concept Amount
0   A       -280
1   B       -140
2   C       -105
3   D       -190

如果要金额列的绝对值:

df_total['Amount'] = df_total['Amount'].abs()

【讨论】:

  • 它绝对可以作为您的解决方案。然而,“A 0X”的概念是为了简单起见。在实际情况下,这个概念要复杂得多,我认为我应该尝试使用正则表达式
猜你喜欢
  • 2020-05-26
  • 2022-08-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多