问题陈述
我有一个字典的元组列表: [(A, B), (A, B),...]. 我���用了 A
和 B
代表这些 "类型" 的字典,因为这些键在这些字典之间都是相同的。
我需要从 A
和 B
中提取一些键来创建一个数据框。
A
中的某些键也出现在 B
中。我想保留 A
中的键。
解决方案:
我能想到几种方法,我很好奇哪种方法更高效。我按照我的猜测将它们列在了下面:
使用列表推导式创建新的字典(或者将
A
扩展为包含部分B
),然后使用pd.DataFrame.from_records
创建数据框。pd.DataFrame.from_records
有一个排除参数。首先合并较大的字典,然后在构建数据框时排除列。转置元组的列表(可能使用
zip(*)
?),使用.from_records
创建两个数据框,一个用于A
,另一个用于B
,然后从每个数据框中删除不必要的列,并将得到的数据框侧面粘合在一起。将每个字典(行)分别创建为数据框,然后在垂直方向上将它们堆叠在一起(
append
或concat
等)。
作为 pandas 的完全新手,很难判断每个操作是什么,何时正在构建视图或执行复制,因此我无法确定哪些操作是昂贵的。
我是否忽略了某种方法?
我的解决方案排列是否正确?
如果将
A
和B
改为数据框,那么连接它们是否更快?数据框有多少内存开销,是否常见实践将其作为单行数据框?
细节说明:
这里是一些简化的示例数据:
[({"chrom": "chr1", "gStart": 1000, "gEnd": 2000, "other": "drop this"},
{"chrom": "chr1": "pStart": 1500, "pEnd": 2500, "drop": "this"}),
({"chrom": "chr2", "gStart": 8000, "gEnd": 8500, "other": "unimportant"},
{"chrom": "chr2": "pStart": 7500, "pEnd": 9500, "drop": "me"}) ]
我想要的结果应该是以下内容的输出:
我认为,这将是以下行动的结果:
pd.DataFrame.from_records([
{"chrom": "chr1", "gStart": 1000, "gEnd": 2000, "pStart": 1500, "pEnd": 2500},
{"chrom": "chr2", "gStart": 8000, "gEnd": 8500, "pStart": 7500, "pEnd": 9500} ] )
我想要的解决方案的伪代码:
如果字典有一个好用的原地select
方法,我认为这个方法可以起作用:
A_fields = [...]
B_fields = [...]
A_B_merged = [a.select(A_fields).extend(b.select(B_fields)) for a, b in A_B_not_merged]
A_B_dataframe = pd.DataFrame.from_records(A_B_merged)