【问题标题】:Logic to replace column value in mysql python在mysql python中替换列值的逻辑
【发布时间】:2016-10-27 10:59:44
【问题描述】:
+--- -----+------------+-------------+
|master_id| product_id |products     |
+---------+------------+-------------+
| 0       | 123       | home        |
| 12      | 234       | office      |
| 15      | 456       | home        |
| 0       | 678       | office      |
| 25      | 890       | home        |
| 0       | 145       | office      |
+---+-----------------+--------------+

我有这张表(只显示了部分行,1000多行),我想写一个逻辑,这样,每当

master_id = 0 , master_id = product_id

我将它移到了 pandas 数据框中。 现在我该怎么写这个逻辑

【问题讨论】:

    标签: python mysql sql python-2.7


    【解决方案1】:

    这个不需要pandas,直接通过数据库就可以了。

    如果您只想以不同的方式显示记录:

    SELECT CASE master_id WHEN 0 THEN product_id ELSE master_id END AS master_id,
           product_id,
           products
    FROM   mytable
    

    如果你真的想更新数据库,那就更简单了:

    UPDATE mytable
    SET    master_id = product_id
    WHERE  master_id = 0
    

    【讨论】:

    • 我可以使用选择不同的大小写(...)
    • 我可以使用 select distinct 吗?我想找到我查询的产品数量。 SELECT DISTINCT CASE master_id WHEN 0 THEN product_id ELSE master_id END AS master_id, count(distinct(product_id) as total_products from mytable group by master_id
    • 您应该按相同的 case 语句分组,而不是 master_id。在这样的查询中使用 distinct 是可能的,但也是多余的,因为 group by 负责唯一性。
    【解决方案2】:

    这是你想要的吗?

    select (case when master_id = 0 then product_id else master_id end) as master_id,
           product_id, products
    from t;
    

    【讨论】:

    • 我可以使用选择不同的大小写(...)
    • 我可以使用 select distinct 吗?我想找到我查询的产品数量。选择不同的(当master_id = 0然后product_id else master_id结束时)作为master_id,count(distinct(product_id)作为master_id从mytable组中的total_products
    • @SRingne 。 . .如果您还有其他问题,您应该将其作为问题而不是在评论中提出。但是是的,select distinct 中的distinct 适用于select 中的所有表达式。您需要使用group by 进行计数。如果你不明白,你应该花点时间学习 SQL。
    【解决方案3】:

    如果您想使用 pandas 数据框,可以使用 numpy.where 函数

    import numpy as np
    import pandas as pd
    
    # initialise dataframe
    df = pd.DataFrame([[0, 12, 15, 0, 25],
                      [123, 234, 456, 678, 890],
                      ['home', 'office', 'home', 'office', 'home']]).T
    df.columns = ['master_id', 'product_id', 'products']
    
    # Now do fix master_id
    df.master_id = np.where(df.master_id == 0, df.product_id, df.master_id)
    
    # New df:
        master_id   product_id  products
    0   123          123          home
    1   12           234          office
    2   15           456          home
    3   678          678          office
    4   25           890          home
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 1970-01-01
      相关资源
      最近更新 更多