如何根据不同列中的值对相似行进行分组

时间:2019-08-22 03:15:47

标签: python pandas set grouping

我正在尝试根据不同列中的一组值对行进行分组。

data = {'Loan': [100,100,100,200,200,200,201,201],'Collateral': ['COL-A', 'COL-B', 'COL-C', 'COL-A', 'COL-B','COL-C', 'COL-A', 'COL-B'], 'Pos':[1,1,2,1,1,2, 2, 2]}
temp_df = pd.DataFrame(data)

预期结果应该是

GroupID Loan    Collateral  Pos
10  100 COL-A   1
10  100 COL-B   1
10  100 COL-C   2
10  200 COL-A   1
10  200 COL-B   1
10  200 COL-C   2
20  201 COL-A   2
20  201 COL-B   2

我考虑过不同的方法,但可以使用一些帮助。 GroupID可以是任何东西,我只是选择了一些随机数作为唯一标识符。

1 个答案:

答案 0 :(得分:0)

其中一种选择是使用分组功能

使用当前记录的键(例如 key )调用该函数。 然后,假设索引值为唯一,此函数可以:

  • 读取当前行(row = temp_df.loc[key]
  • 检查关注字段(row.some_column)的值,
  • 根据某些逻辑返回分组密钥。

由于您未指定逻辑,所以我认为分组密钥应为:

  • 如果贷款== 201并且Pos == 2 ,则 20
  • 否则 10

因此分组功能可以是:

def grpFun(key):
    row = temp_df.loc[key]
    ln = row.Loan
    p = row.Pos
    return 20 if ln == 201 and p == 2 else 10

要对行进行分组,请运行:

gr = temp_df.groupby(grpFun)

要查看结果,请运行:

for key, grp in gr:
    print(f'\nGroup: {key}\n{grp}')

(您的数据),您将看到:

Group: 10
   Loan Collateral  Pos
0   100      COL-A    1
1   100      COL-B    1
2   100      COL-C    2
3   200      COL-A    1
4   200      COL-B    1
5   200      COL-C    2

Group: 20
   Loan Collateral  Pos
6   201      COL-A    2
7   201      COL-B    2

变种2

如果您希望将此分组密钥另存为单独列, 例如为了将来使用,方法应该有所不同:

如下定义分组功能:

def grpFun2(row):
    ln = row.Loan
    p = row.Pos
    return 20 if ln == 201 and p == 2 else 10

将其应用于每一行,将结果保存在新列中:

temp_df.insert(0, 'GroupID', temp_df.apply(grpFun2, axis=1))

根据您的评论进行编辑

如果要让每个组在 Collat​​eral Position 中具有相同的值 然后只需在这2列上 groupby

temp_df.groupby(['Collateral', 'Position'])

然后随便对每个组进行处理。

缺点(我认为不是很重要)是分组密钥是 现在是由这两列组成的元组(实际上是一对)。

但是请注意,现在您的分组将不同于预期的结果:

Group (COL-A, 1):
100 COL-A   1
200 COL-A   1

Group (COL-A, 2):
201 COL-A   2

Group (COL-B, 1):
100 COL-B   1
200 COL-B   1

Group (COL-B, 2):
201 COL-B   2

Group (COL-C, 2):
100 COL-C   2
200 COL-C   2