Splitting a dataframe with complex numbers into real and imaginary numbers with python

Question:

I would like to split the following complex dataframe into two columns,

df = pd.DataFrame({"AB": ['0.316227766016838-0.316227766016838i',
                    '0.316227766016838-0.316227766016838i',
                    '0.316227766016838-0.316227766016838i',
                    '0.316227766016838-0.316227766016838i',
                    '0.316227766016838+0.316227766016838i',
                    '0.3162277660168380+.316227766016838i']})

I tried in the following way but it works either for – or +

df1=df['AB'].str.split('-', n=1, expand=True)

How can I get two new columns for real and imaginary values only? Thanks!

Asked By: Rupak Paul

||

Answers:

Convert values to numpy array with repalce i to j with casting by np.complex128 and then get real and imaginary parts to new columns of DataFrame:

df = pd.DataFrame({"AB": ['0.316227766016838-0.316227766016838i',
                    '0.316227766016838-0.316227766016838i',
                    '0.316227766016838-0.316227766016838i',
                    '0.316227766016838-0.316227766016838i',
                    '0.316227766016838+0.316227766016838i',
                    '0.316227766016838+0.316227766016838i']})

arr = np.complex128(df['AB'].str.replace('i', 'j').to_numpy())
print (arr)
[0.31622777-0.31622777j 0.31622777-0.31622777j 0.31622777-0.31622777j
 0.31622777-0.31622777j 0.31622777+0.31622777j 0.31622777+0.31622777j]

df = df.assign(real = arr.real, imag = arr.imag)
print (df)
                                     AB      real      imag
0  0.316227766016838-0.316227766016838i  0.316228 -0.316228
1  0.316227766016838-0.316227766016838i  0.316228 -0.316228
2  0.316227766016838-0.316227766016838i  0.316228 -0.316228
3  0.316227766016838-0.316227766016838i  0.316228 -0.316228
4  0.316227766016838+0.316227766016838i  0.316228  0.316228
5  0.316227766016838+0.316227766016838i  0.316228  0.316228
Answered By: jezrael
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.