如何创建以site_name为键、其余列数据为值的DataFrame字典?
解决方案
从已有DataFrame生成目标字典
最简洁的方法是利用Pandas的groupby功能,直接将分组结果转换为字典:
import pandas as pd # 你的原始DataFrame df = pd.DataFrame( [[201801, 0.5, 273.4, 'Fleet'], [201801, 0.34, 277.4, 'Drake'], [201801, 0.75, 255, 'Bay'], [201802, 0.97, 244.4, 'Fleet'], [201802, 0.54, 267.4, 'Drake'], [201802, 0.89, 235, 'Bay']], columns=['time', 'windspeed', 'winddir', 'site_name'] ) # 生成目标字典 site_dict = dict(tuple(df.groupby('site_name')))
解释:
df.groupby('site_name'):按照site_name列的取值对DataFrame进行分组,返回一个GroupBy对象。tuple(df.groupby('site_name')):将分组对象转换为包含(组名, 子DataFrame)的元组序列。dict(...):把元组序列直接转换为字典,其中元组的第一个元素是键(站点名称),第二个元素是对应的值(包含其余三列数据的子DataFrame)。
你可以通过site_dict['Fleet']查看对应站点的数据,结果会是只包含该站点所有行、且保留time/windspeed/winddir列的DataFrame。
直接从数组创建目标字典
如果你的数据原本是4个独立数组,不需要先合并成大DataFrame的话,可以用collections.defaultdict来分类收集数据,再逐个转换为DataFrame:
from collections import defaultdict import pandas as pd # 假设你的四个输入数组 time_arr = [201801, 201801, 201801, 201802, 201802, 201802] windspeed_arr = [0.5, 0.34, 0.75, 0.97, 0.54, 0.89] winddir_arr = [273.4, 277.4, 255, 244.4, 267.4, 235] site_name_arr = ['Fleet', 'Drake', 'Bay', 'Fleet', 'Drake', 'Bay'] # 初始化一个默认字典,每个键对应一个存储列数据的字典 site_data = defaultdict(lambda: {'time': [], 'windspeed': [], 'winddir': []}) # 遍历所有数据点,按站点分类收集 for t, ws, wd, site in zip(time_arr, windspeed_arr, winddir_arr, site_name_arr): site_data[site]['time'].append(t) site_data[site]['windspeed'].append(ws) site_data[site]['winddir'].append(wd) # 将每个站点的收集数据转换为DataFrame,生成最终字典 site_dict = {site: pd.DataFrame(data) for site, data in site_data.items()}
解释:
defaultdict(lambda: {'time': [], ...}):自动为每个新出现的站点创建一个包含空列表的字典,用来存储对应列的数据。zip(...):将四个数组按位置一一配对,遍历每个数据点。- 最后用字典推导式,把每个站点的列数据字典转换为DataFrame,直接得到目标字典。
这样就跳过了合并成大DataFrame的步骤,在数据量较大时可能会节省一点内存开销。
内容的提问来源于stack exchange,提问作者splodyn
相关产品推荐
相关产品推荐

