我正在尝试根据不同列中的一组值对行进行分组。
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可以是任何东西,我只是选择了一些随机数作为唯一标识符。
答案 0 :(得分:0)
其中一种选择是使用分组功能。
使用当前记录的键(例如 key )调用该函数。 然后,假设索引值为唯一,此函数可以:
row = temp_df.loc[key]
)row.some_column
)的值,由于您未指定逻辑,所以我认为分组密钥应为:
因此分组功能可以是:
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
如果您希望将此分组密钥另存为单独列, 例如为了将来使用,方法应该有所不同:
如下定义分组功能:
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))
如果要让每个组在 Collateral 和 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