题目要求:
表:cities+-------------+---------+
| Column Name | Type |
+-------------+---------+
| state | varchar |
| city | varchar |
+-------------+---------+
(state, city) 是这张表的主键(有不同值的列的组合)。
这张表的每一行包含州名和其中的城市名。
编写一个解决方案来 查找每个州的所有城市,并将它们组合成 一个逗号分隔 的字符串。返回结果表以 state 升序 排序。结果格式如下所示。示例:输入:cities 表:+-------------+---------------+
| state | city |
+-------------+---------------+
| California | Los Angeles |
| California | San Francisco |
| California | San Diego |
| Texas | Houston |
| Texas | Austin |
| Texas | Dallas |
| New York | New York City |
| New York | Buffalo |
| New York | Rochester |
+-------------+---------------+
输出:+-------------+---------------------------------------+
| state | cities |
+-------------+---------------------------------------+
| California | Los Angeles, San Diego, San Francisco |
| New York | Buffalo, New York City, Rochester |
| Texas | Austin, Dallas, Houston |
+-------------+---------------------------------------+
解释:California:所有城市 ("Los Angeles", "San Diego", "San Francisco") 以逗号分隔的字符串列出。
New York:所有城市 ("Buffalo", "New York City", "Rochester") 以逗号分隔的字符串列出。
Texas:所有城市 ("Austin", "Dallas", "Houston") 以逗号分隔的字符串列出。
注意:输出表以州名升序排序。
MySQL解法:
题目要求按照洲名进行分组,而针对城市名聚合的方式是按照某种方式对数据进行拼接。MySQL中有针对这种需求的函数:GROUP_CONCAT 该函数可以按照某种方式对字符串进行聚合拼接
# Write your MySQL query statement below
SELECT state,GROUP_CONCAT(city ORDER BY city SEPARATOR ', ') AS cities
FROM cities
GROUP BY state
这里没有特别针对state进行排序,因为已经用state进行分组了,系统默认对该字段按照ASC方式排序,正好符合题意
pandas解法:
要拼接字符串,首先要用到str.join()函数,确定分割字符串的str符号是什么。想要将join函数应用到数据全体,可以在分组的数据后,通过聚合函数将join遍历传入到要作用的列中
import pandas as pddef find_cities(cities: pd.DataFrame) -> pd.DataFrame:cities=cities.sort_values(by='city')cities=cities.groupby('state')['city'].agg(lambda x:', '.join(x)).reset_index(name='cities')cities=cities.sort_values(by='state')return cities
这里分组后,通过agg聚合函数,针对city列,利用lambda遍历函数将join函数应用到分组后的city列全部数据,实现分组后的字符串拼接