表:Products
+-------------+---------+ | Column Name | Type | +-------------+---------+ | product_id | int | | store1 | int | | store2 | int | | store3 | int | +-------------+---------+ 在 SQL 中,这张表的主键是 product_id(产品Id)。 每行存储了这一产品在不同商店 store1, store2, store3 的价格。 如果这一产品在商店里没有出售,则值将为 null。
请你重构 Products
表,查询每个产品在不同商店的价格,使得输出的格式变为(product_id, store, price)
。如果这一产品在商店里没有出售,则不输出这一行。
输出结果表中的 顺序不作要求 。
解题思路:
1.列变行
products = pd.melt(products, id_vars=['product_id'], value_vars=['store1', 'store2', 'store3'], var_name = 'store', value_name='price')
products = products[~products['price'].isna()]
注:
melt()
是 Pandas 中的一个函数,用于将数据框从宽格式(wide format)转换为长格式(long format)。它将数据框中的列名作为标识符变量,并将这些列展开成一个或多个观察值变量。
以下是 melt()
函数的详细解释:
语法:
DataFrame.melt(id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None)
参数:
id_vars
:可选参数,指定要保留的列,作为标识符变量。这些列不会被展开,默认为 None,表示所有的列都会被展开。value_vars
:可选参数,指定要展开的列,默认为 None,表示除了id_vars
列之外的所有列都会被展开。var_name
:可选参数,指定新生成的列的名称,默认为 None,表示使用原始列的名称作为新列的名称。value_name
:可选参数,指定新生成的值列的名称,默认为'value'
。col_level
:可选参数,指定要展开的多级列的级别,默认为 None。
返回值: 返回一个新的数据框,其中包含将原始数据框中的列展开后得到的观察值。