Во-первых, необходимо определить, какие столбцы содержат какой префикс. Затем мы используем это для выполнения groupby
.
grouper = [next(p for p in prefixes if p in c) for c in df.columns]
u = df.groupby(grouper, axis=1).sum()
ab wx
0 3 7
1 3 7
2 3 7
3 3 7
Почти там, сейчас,
u.sum().to_frame().T
ab wx
0 12 28
Другой вариант использует np.char.startswith
и argmax
для векторизации:
idx = np.char.startswith(
df.columns.values[:, None].astype(str), prefixes).argmax(1)
(pd.Series(df.groupby(idx, axis=1).sum().sum().values, index=prefixes)
.to_frame()
.transpose())
ab wx
0 12 28
Для проксирования Вы могли изучить "RealProxy", если Вы хотите использовать стандартные типы, это - что-то вроде стычки для использования, хотя (и это требует, чтобы классы наследовались MarshalByRefObject).
public class TestProxy<T> : RealProxy where T : class
{
public T Instance { get { return (T)GetTransparentProxy(); } }
private readonly MarshalByRefObject refObject;
private readonly string uri;
public TestProxy() : base(typeof(T))
{
refObject = (MarshalByRefObject)Activator.CreateInstance(typeof(T));
var objRef = RemotingServices.Marshal(refObject);
uri = objRef.URI;
}
// You can find more info on what can be done in here off MSDN.
public override IMessage Invoke(IMessage message)
{
Console.WriteLine("Invoke!");
message.Properties["__Uri"] = uri;
return ChannelServices.SyncDispatchMessage(message);
}
}
Кроме того, Вы могли получить "DynamicProxy" из Замка.. Это работает немного лучше, по моему опыту..
При использовании одного из тех, Вы не обязательно получите высокую эффективность, хотя, я использую их, прежде всего, в вызовах, которые, вероятно, будут медленными во-первых.. Но Вы могли испытать его, если Вы хотите.
Решение Marc будет иметь лучшую производительность.
К сожалению, в C# нет никакой поддержки смешивания. Таким образом, необходимо было бы реализовать все методы или использовать некоторый мощный reflection.emit, чтобы сделать это. Другая альтернатива (дополнительно) прокси / базовый класс декоратора...
abstract class FooBase : IFoo {
protected FooBase(IFoo next) {this.next = next;}
private readonly IFoo next;
public virtual void Bar() { // one of the interface methods
next.Bar();
}
public virtual int Blop() { // one of the interface methods
return next.Blop();
}
// etc
}
затем
class SomeFoo : FooBase {
public SomeFoo(IFoo next) : base(next) {}
public override void Bar() {...}
}
Замечание того использования FooBase
является строго дополнительным; любой IFoo позволяется.