Я думаю, что вы можете обработать все столбцы вместе, DataFrame.add_suffix
и добавить к оригиналу с помощью DataFrame.join
, для второго аналогичная идея с удалить t
:
df = df.join((0.5*(df[col]**2)).add_suffix('sq'))
df = df.join(df[col.difference(['t'])].mul(df["t"], axis=0).add_suffix('t'))
#last added tt column same like t
df['tt'] = df['t']
print (df)
x1 x2 y1 y2 y3 t x1sq x2sq y1sq y2sq y3sq tsq x1t x2t y1t \
date
2018 1 3 8 7 9 1 0.5 4.5 32.0 24.5 40.5 0.5 1 3 8
2019 2 4 6 8 2 2 2.0 8.0 18.0 32.0 2.0 2.0 4 8 12
y2t y3t tt
date
2018 7 9 1
2019 16 4 2
Ваше решение должно работать с циклами, но если производительность многих столбцов должна быть хуже:
col=df.columns.to_list()
for sq in col:
df[sq+"sq"]= 0.5*(df[sq]**2)
for sq in col:
df[sq+"t"]= (df[sq]*df["t"] if sq !="t" else df["t"])
print (df)
x1 x2 y1 y2 y3 t x1sq x2sq y1sq y2sq y3sq tsq x1t x2t y1t \
date
2018 1 3 8 7 9 1 0.5 4.5 32.0 24.5 40.5 0.5 1 3 8
2019 2 4 6 8 2 2 2.0 8.0 18.0 32.0 2.0 2.0 4 8 12
y2t y3t tt
date
2018 7 9 1
2019 16 4 2
РЕДАКТИРОВАТЬ: Решение для нескольких по комбинации столбцов:
from itertools import combinations
df={"date":[2018,2019],'x1': [1, 2], 'x2': [3, 4], 'y1': [8, 6],'y2': [7, 8], 'y3': [9, 2]}
df=pd.DataFrame(data=df)
baseyear=min(df["date"])
df["t"]=df["date"]-baseyear+1
df['date'] = pd.to_datetime(df['date'], format='%Y').dt.year
df.set_index('date',inplace=True)
col = df.columns
col_without_t = col.difference(['t'])
df1 = df.join((0.5*(df[col]**2)).add_suffix('sq'))
df1 = df1.join(df1[col_without_t].mul(df1["t"], axis=0).add_suffix('t'))
df1['tt'] = df1['t']
cc = list(combinations(col,2))
#if want columns without t
#cc = list(combinations(col_without_t,2))
df2 = pd.concat([df[c[1]].mul(df[c[0]]) for c in cc], axis=1, keys=cc)
df2.columns = df2.columns.map(''.join)
df = df.join(df2)
print (df)
x1 x2 y1 y2 y3 t x1x2 x1y1 x1y2 x1y3 ... x2y1 x2y2 x2y3 \
date ...
2018 1 3 8 7 9 1 3 8 7 9 ... 24 21 27
2019 2 4 6 8 2 2 8 12 16 4 ... 24 32 8
x2t y1y2 y1y3 y1t y2y3 y2t y3t
date
2018 3 56 72 8 63 7 9
2019 8 48 12 12 16 16 4
[2 rows x 21 columns]