Использование numpy.abs
и numpy.imag
работа с 2d arrays
- циклы не нужны:
arr = df1.values
df1 = pd.DataFrame(np.abs(arr),
columns=df1.columns,
index=df1.index).add_suffix('_abs')
df2 = pd.DataFrame(np.angle(arr),
columns=df1.columns,
index=df1.index).add_suffix('_angle')
df = pd.concat([df1, df2], axis=1)
print (df)
I1_abs U2_abs I1_abs_angle U2_abs_angle
f
0.000001 1.000000 50.000000 0.000000 0.000000
2.000000 2.236068 40.199502 0.463648 0.099669
Более быстрое решение должно быть объединение массивов вnumpy:
arr = df1.values
a = np.hstack((np.abs(arr), np.angle(arr)))
cols = np.concatenate((df1.columns + '_abs', df1.columns + '_angle'))
df2 = pd.DataFrame(a, columns=cols, index=df1.index)
print (df2)
I1_abs U2_abs I1_angle U2_angle
f
0.000001 1.000000 50.000000 0.000000 0.000000
2.000000 2.236068 40.199502 0.463648 0.099669
Производительность :
#sample - (20000 rows, 20 columns)
df1 = pd.concat([df1] * 10, ignore_index=True, axis=1)
df1 = pd.concat([df1] * 10000, ignore_index=True)
In [177]: %%timeit
...: arr = df1.values
...: df = pd.concat([pd.DataFrame(np.abs(arr),columns=df1.columns,index=df1.index).add_suffix('_abs'), pd.DataFrame(np.angle(arr), columns=df1.columns, index=df1.index).add_suffix('_angle')], axis=1)
...:
26.8 ms ± 893 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [178]: %%timeit
...: arr = df1.values
...: a = np.hstack((np.abs(arr), np.angle(arr)))
...: df1.columns = df1.columns.astype(str)
...: cols = np.concatenate((df1.columns + '_abs', df1.columns + '_angle'))
...: df2 = pd.DataFrame(a, columns=cols, index=df1.index)
...:
21.5 ms ± 172 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [179]: %%timeit
...: result = pd.concat([df1.applymap(abs).add_suffix('_abs'),df1.applymap(np.angle).add_suffix('_angle')], axis=1)
...:
2.24 s ± 59.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)