【问题标题】:Apply lambda on a column in pandas在 pandas 的列上应用 lambda
【发布时间】:2017-06-10 10:47:36
【问题描述】:

我有以下数据框

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

下面是我的代码

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

但是上面的代码给了我一个错误

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

如何解决?

实际代码

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]) )

【问题讨论】:

  • 对我来说它有效,但为什么不使用 csv_data["transformation_edited"] = csv_data["transformation_edited"] * transfactor_countcsv_data["transformation_edited"] = csv_data["transformation_edited"].mul(transfactor_count) 呢?
  • 或者还有其他代码会导致错误?
  • 基本上我使用的是 django,我将从数据库中获取 transfactor_count
  • 可以使用csv_data["transformation_edited"].mul(foreign_key.tranformation_factor) 吗?
  • 点赞csv_data[foreign_key.table_column_name] = csv_data[foreign_key.table_column_name].mul(foreign_key.tranformat‌​ion_factor)

标签: python pandas lambda pandas-apply


【解决方案1】:

正如错误所说,lambda 函数找不到 global 变量。 您可以尝试通过以下方式使其全球化:

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

但正如 jezrael 指出的那样:

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

更加优雅。

您之前可能需要将数据类型更改为浮动:

csv_data["transformation_edited"] = csv_data["transformation_edited"].astype(float) * transfactor_count

【讨论】:

    【解决方案2】:

    您可以在数据框上使用 lambda,如下所示:

    transfactor_count = 5.6;
    csv_data['transformation_edited']=map(lambda x: x * transfactor_count, csv_data['transformation_edited'])
    

    【讨论】:

      猜你喜欢
      • 2018-03-28
      • 2021-02-11
      • 2019-01-09
      • 2013-11-15
      • 2020-12-08
      • 1970-01-01
      • 2020-11-09
      • 2016-06-15
      • 2023-04-08
      相关资源
      最近更新 更多