pandas 按相似的非匹配值对 Dataframe 进行分组

ws51t4hk  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(121)

如果我有一个pandas dataframe,其中包含以下列:idnum金额
我想对 Dataframe 进行分组,使得每个组中的所有行都具有相同的idamount,并且其中每行的num的值与下一行的num的值相差不超过10。
对于相同的id,如果一行到下一行的amount不相同,或者两个num值的绝对差值大于10,则会开始一个新的分组。如果中间有一行的id不同,则不会破坏分组。
我该怎么做呢?
我还没有设法使一个分组,我不寻找匹配的值(如这里,我需要它是接近-但不匹配)。我假设这将需要一些自定义分组功能,但我一直有麻烦把一个在一起

数据框示例:

身份证金额努姆
AAA一百三十十二岁
AAA一百三十三十九
bbbbb二百七十四十一
CCC-CCC一百三十十九
bbbbb二百七十三十七
AAA一百三十四十二
AAA三百八十三十九

预期分组:

第1组:
| 身份证|金额|努姆|
| --------------|--------------|--------------|
| AAA|一百三十|十二岁|
第二组:
| 身份证|金额|努姆|
| --------------|--------------|--------------|
| AAA|一百三十|三十九|
| AAA|一百三十|四十二|
第三组:
| 身份证|金额|努姆|
| --------------|--------------|--------------|
| bbbbb|二百七十|四十一|
| bbbbb|二百七十|三十七|
第四组:
| 身份证|金额|努姆|
| --------------|--------------|--------------|
| CCC-CCC|一百三十|十九|
第五组:
| 身份证|金额|努姆|
| --------------|--------------|--------------|
| AAA|三百八十|三十九|

pu3pd22g

pu3pd22g1#

逻辑并不完全清楚,但假设你想在差距超过10时开始一个新的组:

close = (df.sort_values(by=['amount', 'num'])
           .groupby('amount')
           ['num'].diff().abs().gt(10).cumsum()
         )

for _, g in df.groupby(['amount', close]):
    print(g, end='\n\n')

输出:

id  amount  num
0  aaa-aaa     130   12
3  ddd-ddd     130   19

        id  amount  num
1  bbb-bbb     130   39

        id  amount  num
2  ccc-ccc     270   41
4  eee-eee     270   37
xtupzzrd

xtupzzrd2#

通过amountnum排序,并在连续值之间添加辅助标记列difference(适合阈值):

groups = df.sort_values(['amount', 'num'])\
         .assign(diff_=lambda x: x['num'].diff().abs().fillna(0).le(10))\
         .groupby(['amount', 'diff_'])
for _, g in groups:
    print(g)
id  amount  num  diff_
1  bbb-bbb      130   39  False
         id  amount  num  diff_
0  aaa-aaa      130   12   True
3  ddd-ddd      130   19   True
         id  amount  num  diff_
4  eee-eee      270   37   True
2  ccc-ccc      270   41   True

相关问题