The following implements this with the help of expkv (as that one is expandable and fast, so I can set up the key-filtering easier).
It utilises the internal structure of a .style, parses the stored key list, and filters the values inside of that key list.
Caveat: You have to provide the key path exactly how it was defined in the style, this solution does no extensive path-parsing.
\documentclass[preview,margin=10pt]{standalone}
\usepackage{pgfkeys}
% how a style is defined (current code 2023-06-17)
\iffalse
\pgfkeys{/handlers/.style/.code=\pgfkeys{\pgfkeyscurrentpath/.code=\pgfkeysalso{#1}}}
\pgfkeysdef{/handlers/.code}{\pgfkeysdef{\pgfkeyscurrentpath}{#1}}
\long\def\pgfkeysdef#1#2{%
\long\def\pgfkeys@temp##1\pgfeov{#2}%
\pgfkeyslet{#1/.@cmd}{\pgfkeys@temp}%
\pgfkeyssetvalue{#1/.@body}{#2}%
}
\long\def\pgfkeyslet#1#2{%
\expandafter\let\csname pgfk@#1\endcsname#2%
}
\fi
\pgfkeys
{
/a/.code={a#1}
,/b/.code={b#1}
,/c/.code={c#1}
,/my style/.style = {/a=1, /b=2, /c=3}
}
\usepackage{expkv} % yes, I use expkv to filter pgfkeys...
\makeatletter
\ExplSyntaxOn
\cs_new:Npn \mypgfkeys@checkstyle #1
{
\bool_lazy_and:nnF
{ \tl_if_head_eq_meaning_p:nN {#1} \pgfkeysalso }
{ \exp_args:No \tl_if_single_p:n { \use_none:n #1 } }
}
\ExplSyntaxOff
\protected\def\mypgfkeys@not@a@style
{%
\PackageError{mypgfkeys}{Not a style: \pgfkeyscurrentpath}{}
\mypgfkeys@break
}
\def\mypgfkeys@breakpoint#1{}
\def\mypgfkeys@break#1\mypgfkeys@breakpoint#2{#2}
\pgfkeys{/handlers/.remove from style/.code=\mypgfkeysrmfromstyle{#1}}
\def\mypgfkeysrmfromstyle@mark{\mypgfkeysrmfromstyle@mark}
\protected\def\mypgfkeysrmfromstyle#1%
{%
\begingroup
\ekvcsvloop\mypgfkeysrmfromstyle@makemark{#1}%
\expandafter\let\csname mypgfkeys@@#1\endcsname\mypgfkeysrmfromstyle@mark
\pgfkeysgetvalue{\pgfkeyscurrentpath/.@body}\mypgfkeysrmfromstyle@body
\ifx\mypgfkeysrmfromstyle@body\relax
\mypgfkeys@not@a@style
\fi
\expandafter\mypgfkeys@checkstyle\expandafter
{\mypgfkeysrmfromstyle@body}%
\mypgfkeys@not@a@style
\edef\mypgfkeysrmfromstyle@body
{%
\expanded
{%
\expandafter\mypgfkeysrmfromstyle@do\expandafter
{\mypgfkeysrmfromstyle@body}%
}%
}%
\expanded{%
\endgroup
\unexpanded{\pgfkeys}%
{%
\pgfkeyscurrentpath/.style=
{%
\unexpanded\expandafter\expandafter\expandafter
{\expandafter@gobble\mypgfkeysrmfromstyle@body}%
}%
}%
}%
\mypgfkeys@breakpoint\endgroup
}
\protected\def\mypgfkeysrmfromstyle@makemark#1%
{\expandafter\let\csname mypgfkeys@@#1\endcsname\mypgfkeysrmfromstyle@mark}
\def\mypgfkeysrmfromstyle@do#1%
{\expandafter\mypgfkeysrmfromstyle@do@\expandafter{@secondoftwo#1}}
\def\mypgfkeysrmfromstyle@do@
{\ekvparse\mypgfkeysrmfromstyle@do@k\mypgfkeysrmfromstyle@do@kv}
\def\mypgfkeysrmfromstyle@do@k#1%
{%
\expandafter\ifx\csname mypgfkeys@@#1\endcsname\mypgfkeysrmfromstyle@mark
\expandafter@gobbletwo
\fi
\unexpanded{,#1}%
}
\long\def\mypgfkeysrmfromstyle@do@kv#1#2%
{%
\expandafter\ifx\csname mypgfkeys@@#1\endcsname\mypgfkeysrmfromstyle@mark
\expandafter@gobbletwo
\fi
\unexpanded{,#1= {#2}}%
}
\makeatother
%\expandafter\show\csname pgfk@/my style/.@body\endcsname
\begin{document}
\pgfkeys{/my style}\par
\pgfkeys{/my style/.remove from style={/b,/c}}
\pgfkeys{/my style}
\end{document}
