3

I have the below data frame

ipdb> csv_data
  country_edited  sale_edited  date_edited  transformation_edited
0          India       403171     21091956                      1
1         Bhutan       394096     21091956                      2
2          Nepal       361372     21091956                      3
3         madhya       355883     21091956                      4
4          sudan       262949     21091956                      5

and below is my code

transfactor_count = 5.6
csv_data["transformation_edited"] = csv_data["transformation_edited"].apply(lambda x: x * transfactor_count)

But the above code was giving me an error

*** NameError: global name 'transfactor_count' is not defined

How to solve this ?

Actual code

for foreign_key in data_mapping_record.csvdatabasecolumnmapping_set.all():
    data_type = foreign_key.data_type
    trans_factor = foreign_key.tranformation_factor
    if data_type == "Decimal":
        import ipdb; ipdb.set_trace()
        csv_data[foreign_key.table_column_name] = csv_data[foreign_key.table_column_name].apply(lambda x: x * trans_factor )
    elif data_type in ["Date", "Datetime"]:
        csv_data[foreign_key.table_column_name] = csv_data[foreign_key.table_column_name].apply( lambda d: datetime.strptime(d, dates[date]) )
Fabio Lamanna
  • 20,504
  • 24
  • 90
  • 122
Shiva Krishna Bavandla
  • 25,548
  • 75
  • 193
  • 313
  • 1
    For me it works, but why dont use `csv_data["transformation_edited"] = csv_data["transformation_edited"] * transfactor_count` or `csv_data["transformation_edited"] = csv_data["transformation_edited"].mul(transfactor_count)` ? – jezrael Jan 25 '17 at 10:00
  • Or there is some another code which can cause error? – jezrael Jan 25 '17 at 10:01
  • basically i was using django and i am gonna get transfactor_count from database – Shiva Krishna Bavandla Jan 25 '17 at 10:03
  • Is possible use `csv_data["transformation_edited"].mul(foreign_key.tranformation_factor)` ? – jezrael Jan 25 '17 at 10:06
  • like `csv_data[foreign_key.table_column_name] = csv_data[foreign_key.table_column_name].mul(foreign_key.tranformat‌​ion_factor)` – jezrael Jan 25 '17 at 10:08
  • *** TypeError: ufunc 'multiply' did not contain a loop with signature matching types dtype(' – Shiva Krishna Bavandla Jan 25 '17 at 10:10
  • It seems more complicated, how works csv_data[foreign_key.table_column_name] = csv_data[foreign_key.table_column_name]* foreign_key.tranformation_factor) ? – jezrael Jan 25 '17 at 10:19
  • yeah it worked i need to convert `foreign_key.tranformation_factor` to `int(foreign_key.tranformation_factor)`, but the problem is why can't i access the variables just before i declared ? like for example i have declared `dates = { 'dd/mm/yy': "%d/%m/%Y", 'mm/dd/yy': "%m/%d/%Y", }` as a dictionary, but when i tried to access like `csv_data[foreign_key.table_column_name].apply( lambda d: datetime.datetime.strptime(d, dates[foreign_key.date_format]) )` it says `*** NameError: global name 'dates' is not defined` ? – Shiva Krishna Bavandla Jan 25 '17 at 10:21
  • any idea why we are getting global name error ? – Shiva Krishna Bavandla Jan 25 '17 at 10:28
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/133966/discussion-between-shiva-krishna-and-jezrael). – Shiva Krishna Bavandla Jan 25 '17 at 10:28

2 Answers2

4

As the error already says, the lambda function can't find the global variable. You can try make it global by:

global transfactor_count
transfactor_count = 5.6
csv_data["transformation_edited"] = csv_data["transformation_edited"].apply(lambda x: x * transfactor_count)

But as jezrael pointed out:

csv_data["transformation_edited"] = csv_data["transformation_edited"] * transfactor_count 

is much more elegant.

you might have to change the datatype to float before:

csv_data["transformation_edited"] = csv_data["transformation_edited"].astype(float) * transfactor_count
Jan Zeiseweis
  • 3,718
  • 2
  • 17
  • 24
-1

You can use lambda on dataframe as below:

transfactor_count = 5.6;
csv_data['transformation_edited']=map(lambda x: x * transfactor_count, csv_data['transformation_edited'])
Rahul Agarwal
  • 4,034
  • 7
  • 27
  • 51
sandeep
  • 26
  • 1