Assigning A Group To The Attribute Set Through Patch File (Programmatically)

Method To Assigning A Group To The Product Attribute.

1- For Assigning A Group To The Product Attribute you need to create a custom module. 
Like:
Vendor/Module
Esparksinc/AttrGroup

2- Create DemoAttributeSetAndItsGroup.php file inside.
     app/code/Esparksinc/AttrGroup/Setup/Patch/Data

And paste this code into it:

<?php

/**
 *  Esparks.
 *
 */

namespace Esparksinc\AttrGroup\Setup\Patch\Data;

use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\Patch\DataPatchInterface;
use Magento\Catalog\Setup\CategorySetupFactory;
use Magento\Eav\Model\Entity\Attribute\SetFactory as AttributeSetFactory;
use Magento\Eav\Setup\EavSetup;

class DemoAttributeSetAndItsGroup implements DataPatchInterface
{
    /**
     * @var ModuleDataSetupInterface
     */
    private $moduleDataSetup;

    /**
     * @var AttributeSetFactory
     */
    private $attributeSetFactory;

    /**
     * @var CategorySetupFactory
     */
    private $categorySetupFactory;

    /**
     * @param ModuleDataSetupInterface $moduleDataSetup
     * @param AttributeSetFactory $attributeSetFactory
     * @param CategorySetupFactory $categorySetupFactory
     */
    public function __construct(
        ModuleDataSetupInterface $moduleDataSetup,
        AttributeSetFactory $attributeSetFactory,
        CategorySetupFactory $categorySetupFactory
    ) {
        $this->moduleDataSetup = $moduleDataSetup;
        $this->attributeSetFactory = $attributeSetFactory;
        $this->categorySetupFactory = $categorySetupFactory;
    }

    /**
     * {@inheritdoc}
     */
    public function apply()
    {
        /** @var EavSetup $eavSetup */
        try {
            $categorySetup = $this->categorySetupFactory->create(['setup' => $this->moduleDataSetup]);
            $attributeSet = $this->attributeSetFactory->create();
            $entityTypeId = $categorySetup->getEntityTypeId(\Magento\Catalog\Model\Product::ENTITY);
            $attributeSetId = $categorySetup->getDefaultAttributeSetId($entityTypeId);
            $data = [
                'attribute_set_name' => 'Demo Attribute Set',
                'entity_type_id' => $entityTypeId,
                'sort_order' => 200,
            ];
            $attributeSet->setData($data);
            $attributeSet->validate();
            $attributeSet->save();
            $attributeSet->initFromSkeleton($attributeSetId);
            $attributeSet->save();
            $firstAttributeGroupName = 'Demo Group1';
            $newAttributeSetId = $categorySetup->getAttributeSetId($entityTypeId, 'Demo Attribute Set');
            $categorySetup->addAttributeGroup(
                $entityTypeId,
                $newAttributeSetId,
                $firstAttributeGroupName,
                200 // sort order
            );
            $firstAttributeGroupId = $categorySetup->getAttributeGroupId(
                $entityTypeId,
                $newAttributeSetId,
                $firstAttributeGroupName
            );
            // Assign the attribute set to the attribute group
            $attributeCode = 'eco_collection'; // Replace with your actual attribute code
            $categorySetup->addAttributeToGroup(
                $entityTypeId,
                $newAttributeSetId,
                $firstAttributeGroupId,
                $attributeCode
            );
        } catch (\Exception $e) {
            return $e->getMessage();
        }
    }

    /**
     * {@inheritdoc}
     */
    public static function getDependencies()
    {
        return [];
    }

    /**
     * {@inheritdoc}
     */
    public function getAliases()
    {
        return [];
    }
}

  

The provided code is a Magento 2 data patch that creates a new attribute set and its associated attribute group. Here’s a concise definition:
The code defines a class named `DemoAttributeSetAndItsGroup` that implements the `DataPatchInterface` in the `Esparksinc\AttrGroup\Setup\Patch\Data` namespace. This class is responsible for creating a new attribute set and adding an attribute group to it.
The class constructor accepts three dependencies: `ModuleDataSetupInterface`, `AttributeSetFactory`, and `CategorySetupFactory`, which are used for database setup and attribute set/group creation.
The `apply` method is executed when the patch is applied. It uses the `CategorySetupFactory` to retrieve the entity type ID for products and the default attribute set ID. It then creates a new attribute set with the name “Demo Attribute Set” and a sort order of 200. The attribute set is saved and initialized from the default attribute set. Next, a new attribute group named “Demo Group1” is added to the attribute set with a sort order of 200. Finally, the attribute with the code “eco_collection” is assigned to the newly created attribute group.

The `getDependencies` method returns an empty array, indicating that this patch doesn’t have any dependencies on other patches.
The `getAliases` method also returns an empty array, indicating that no aliases are defined for this patch.
Overall, this code creates a new attribute set, adds an attribute group to it, and assigns a specific attribute to the attribute group using Magento 2 setup and category setup functionalities.

Run these commands:

php bin/magento setup:upgrade
php bin/magento setup:di:compile
php bin/magento setup:static-content:deploy-f
php bin/magento cache:clean
chmod -R 777 var/pub/generated

See the result magento admin panel on stores => Attribute => Attributeset:

Open Demo Attribute Set to see the group Demo Group 1 which is assigned to Demo Attribute Set :

Note:

This patch file works once if you want to change something you need to delete the patch from the database then run this patch again.