У меня есть DataFrame, как показано ниже:
df = {'col_1': [1,2,3,4,5,6,7,8,9,10],
'col_2': [1,2,3,4,5,6,7,8,9,10],
'col_3':['A','A','A','A','A','B','B','B','B','B']}
df = pd.DataFrame(df)
, в то время как реальные данные, которые я использую, содержат сотни столбцов, я хочу манипулировать этими столбцами, используя различные функции, такие как min
, max
а также самоопределяемая функция, такая как:
def dist(x):
return max(x) - min(x)
def HHI(x):
ss = sum([s**2 for s in x])
return ss
Вместо того, чтобы записывать много строк, я хочу иметь такую функцию:
def myfunc(cols,fun):
return df.groupby('col_3')[[cols]].transform(lambda x: fun)
# which allow me to do something like:
df[['min_' + s for s in cols]] = myfunc(cols, min)
df[['max_' + s for s in cols]] = myfunc(cols, max)
df[['dist_' + s for s in cols]] = myfunc(cols, dist)
Возможно ли это в Python (мое предположение "да")?
Тогда как, если да?
РЕДАКТИРОВАТЬ ====== О НАЗВАНИИ САМОПРЕДЕЛЕННОЙ ФУНКЦИИ =======
В соответствии с решением jpp
, то, о чем я просил, возможно, по крайней мере для встроенных функций, требуется больше работы в отношении самоопределяемой функции.
Работоспособное решение,
temp = df.copy()
for func in ['HHI','DIST'] :
print(func)
temp[[ func + s for s in cols]] = df.pipe(myfunc,cols,eval(func))
Ключевым моментом здесь является использование eval
перестройки для преобразования строкового выражения как функции.Тем не менее, может быть лучший способ сделать это, с нетерпением жду, чтобы увидеть.
РЕДАКТИРОВАТЬ ====== за комментарий jpp о названии самоопределяемой функции =======
Комментарий jpp, который передает имя функции непосредственно в myfun
, действителен на основании моего теста, однако новое имя столбца на основе func
будет выглядеть примерно так: <function HHI at 0x00000194460019D8>
, что не оченьчитаемая, модификация temp[[ str(func.__name__) + s for s in cols]]
, надеюсь, это поможет тем, кто придет к этой проблеме позже.