【问题标题】:Multiply pandas column values with the column header value (if the header value is number/digit)将 pandas 列值与列标题值相乘(如果标题值是数字/数字)
【发布时间】:2020-08-06 05:34:56
【问题描述】:

在将 csv 加载到 pandas 数据框后,我已经更新了列的真实数据集。谢谢。 我的 csv 数据有很多列,其中一些列如下。如果列标题是数字或数字,我必须将每个列值相乘。

输入数据:例如,第 5 列和第 7 列的标题上有数字。我需要将该列中的所有值乘以相应的标题值。谢谢

Unnamed: 0 Unnamed: 1 Retailer Unnamed: 2 1,750.00  Unnamed: 7  1,800.00
Name       Toy        N1       Manager    0.8       city        10
Name       Toy        N2       Manager    20        city        30
Name       Toy        N1       Manager    1.1       city        10
Name       Bas        N1       Manager    0.2       city        10

预期输出:

Unnamed: 0 Unnamed: 1 Retailer Unnamed: 2 1,750.00     Unnamed: 7  1,800.00
Name       Toy        N1       Manager    1400         city        18000
Name       Toy        N2       Manager    35000        city        54000
Name       Toy        N1       Manager    1925         city        36000
Name       Bas        N1       Manager    350          city        36000

请告诉我,因为我的数据集中有很多列,例如第 5 列和第 7 列。谢谢。

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    您可以遍历列,如果它是一个数字,您可以将行乘以该列。

    for col in df.columns:
        if col.isdigit():
            df[col] = df[col].apply(lambda x: x * pd.to_numeric(col))
    

    【讨论】:

      【解决方案2】:
      #extract columns that start with numbers
      cols = df.columns[df.columns.str.match('^\d+')]
      
      #assign result of multiplication back to origina dataframe
      df.loc[:,cols] = df.loc[:,cols].mul(cols.str.replace(',','').astype(float))
      
      df
      
      
        Unnamed: 0    Unnamed: 1  Retailer    Unnamed: 2  1,750.00    Unnamed: 7  1,800.00
      0   Name        Toy          N1        Manager      1400.0      city     18000.0
      1   Name        Toy          N2        Manager      35000.0     city     54000.0
      2   Name        Toy          N1        Manager      1925.0      city     18000.0
      3   Name        Bas          N1        Manager      350.0       city     18000.0
      

      【讨论】:

      • 谢谢。它适用于上述示例数据集。但在我来自 csv 的真实数据集中,第 5 列和第 7 列分别类似于“1,750.00 1,800.00”。在这种情况下,这些不会作为 number_cols 被拾取。我尝试将 csv 中的格式也更​​改为数字。但它不起作用。请告诉我。谢谢。
      • "1,750.00 1,800.00" 一个列标题中有两个数字?你介意用这个信息更新你的数据吗?它还允许其他人加入
      • 感谢您的建议,我已经更新了数据集。道歉。
      • 我做了一些修改。请检查它是否适用于您的实际数据
      • 非常感谢您的友好指导。我再次感到震惊,因为在真实数据集中,我的 csv 文件的标题或第一行中有一些重复的数字(1,800.00.1)。这是您当前解决方案的错误。我会先解决这个问题,然后再试一次。谢谢
      【解决方案3】:

      您可以使用 isdigit 函数检查该列是否为数字,如果是,则将其乘以该列,否则保持该列不变。

      (
          df.apply(lambda x: x.mul(float(str(x.name).replace(',','')))
                   if str(x.name).replace(',','').replace('.','',1).isdigit() 
                   else x)
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-15
        • 1970-01-01
        相关资源
        最近更新 更多