How to multiply a column in panda frame with a function

Question:

I have a data text file with two columns (called X and Y):

-2.321404951 0.6231752828E-20
-2.311404951 0.2386233219E-19
-2.301404951 0.8958714819E-19
-2.291404951 0.3297711248E-18
-2.281404951 0.1190194012E-17
-2.271404951 0.4211777921E-17
-2.261404951 0.1461370397E-16
-2.251404951 0.4971725004E-16
-2.241404951 0.1658482566E-15
-2.231404951 0.5424716898E-15
-2.221404951 0.1739847682E-14
-2.211404951 0.5471662415E-14
-2.201404951 0.1687359166E-13
-2.191404951 0.5102494608E-13
-2.181404951 0.1513043201E-12
-2.171404951 0.4399681358E-12
-2.161404951 0.1254584823E-11
-2.151404951 0.3508293965E-11
-2.141404951 0.9620945929E-11
-2.131404951 0.2587465918E-10
-2.121404951 0.6824586233E-10
-2.111404951 0.1765359553E-09
-2.101404951 0.4478742859E-09

I would like to obtain data by the formula f(X)*Y with f(X) = 1/(exp(X)-5).
Here is my code, but it does not work:

import pandas as pd
import numpy as np
import sys
df = pd.read_csv("dos.txt", sep='delimiter', header=None, engine='python')
F = 1 /  (np.exp((df.loc[:,0] - 5)))
y=df.loc[:,1]*F
print(y)

The error is TypeError: cannot convert the series to <class 'float'>. Can anyone help me out?

Asked By: Binh Thien

||

Answers:

You didn’t provide a proper separator for parsing the CSV file, so your data was parsed as one string per line instead of multiple numerical columns. Here’s a fix:

import pandas as pd
import numpy as np
import sys
df = pd.read_csv("dos.txt", sep="s+", header=None, engine='python')
F = 1 /  (np.exp((df.loc[:,0] - 5)))
y=df.loc[:,1]*F
print(y)
Answered By: Amit Eyal

To resolve your float issue, you need to define the dtype when calling read_csv. dtype takes a dict something like:

{‘a’: np.float64, ‘b’: np.int32, ‘c’: ‘Int64’}

see: https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html.

Then you can just apply a formula to the columns directly, something like:

import pandas as pd, numpy as np

df = pd.DataFrame({ 'x': [1, 2, 3, 4, 5], 'y': [6, 7, 8, 9, 10]})
df['z'] = (1 / (np.exp(df.x) - 5)) * df.y

or if you want to use a function:

def fn(x, y):
     return (1 / (np.exp(x) - 5)) * y
df['z'] = fn(df.x, df.y)
Answered By: John M.

Another way:

def expnFn(x):
    return 1/(np.exp(x)-5)

df['Z'] = df.apply(lambda x: x['X']*expnFn(x['Y']), axis = 1)



 X             Y         Z
0  -2.321405  6.231753e-21  0.580351
1  -2.311405  2.386233e-20  0.577851
2  -2.301405  8.958715e-20  0.575351
3  -2.291405  3.297711e-19  0.572851
4  -2.281405  1.190194e-18  0.570351
5  -2.271405  4.211778e-18  0.567851
6  -2.261405  1.461370e-17  0.565351
7  -2.251405  4.971725e-17  0.562851
8  -2.241405  1.658483e-16  0.560351
9  -2.231405  5.424717e-16  0.557851
10 -2.221405  1.739848e-15  0.555351
11 -2.211405  5.471662e-15  0.552851
12 -2.201405  1.687359e-14  0.550351
13 -2.191405  5.102495e-14  0.547851
14 -2.181405  1.513043e-13  0.545351
15 -2.171405  4.399681e-13  0.542851
16 -2.161405  1.254585e-12  0.540351
17 -2.151405  3.508294e-12  0.537851
18 -2.141405  9.620946e-12  0.535351
19 -2.131405  2.587466e-11  0.532851
20 -2.121405  6.824586e-11  0.530351
21 -2.111405  1.765360e-10  0.527851
22 -2.101405  4.478743e-10  0.525351
Answered By: ragas
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.