如何用itertools生成Pandas Series元素全排列并返回Series/DataFrame
我来帮你搞定这个生成二元全排列的需求,顺便修正你函数里的问题~
首先先说说你原函数里的几个小问题:
- 完全没必要用
global i,循环里的i只是迭代permutations的临时变量,全局变量只会带来不必要的副作用,用nonlocal更是错配(你根本没在嵌套函数里) - 最后return语句没写完,而且
permus_pairs是普通列表,没有.a...这类属性
下面是完善后的函数,支持返回DataFrame(更直观,分两列展示配对)或者Series(把配对拼接成字符串),你可以按需选择:
import itertools import pandas as pd def permus_maker(ticker_series): # 从Series中提取值,生成2元全排列迭代器 perm_pairs = itertools.permutations(ticker_series.values, 2) # 选项1:返回DataFrame,两列分别存配对的两个元素 perm_df = pd.DataFrame(perm_pairs, columns=["ticker_left", "ticker_right"]) # 选项2:返回Series,把配对拼接成字符串(比如"ALJ-ALDW") # 注意:迭代器只能被遍历一次,如果要选这个,需要重新生成一次perm_pairs # perm_pairs = itertools.permutations(ticker_series.values, 2) # perm_series = pd.Series(["-".join(pair) for pair in perm_pairs], name="permutation_pairs") # 按需返回其中一个即可 return perm_df
测试一下(模拟你的SQL查询结果)
# 模拟从数据库查到的ticker Series ticker_series = pd.Series(["ALJ", "ALDW", "BP", "BPT"], name="ticker") # 调用函数获取结果 result = permus_maker(ticker_series) print(result)
输出的DataFrame会是这样:
ticker_left ticker_right 0 ALJ ALDW 1 ALJ BP 2 ALJ BPT 3 ALDW ALJ 4 ALDW BP 5 ALDW BPT 6 BP ALJ 7 BP ALDW 8 BP BPT 9 BPT ALJ 10 BPT ALDW 11 BPT BP
如果选返回Series,输出会是:
0 ALJ-ALDW 1 ALJ-BP 2 ALJ-BPT 3 ALDW-ALJ 4 ALDW-BP 5 ALDW-BPT 6 BP-ALJ 7 BP-ALDW 8 BP-BPT 9 BPT-ALJ 10 BPT-ALDW 11 BPT-BP Name: permutation_pairs, dtype: object
额外说明
- 如果你从SQL查出来的是DataFrame而不是Series,只需要传
df["ticker"]给函数就行 itertools.permutations生成的是迭代器,直接传给pd.DataFrame比先转成列表更高效,当然你也可以用list(perm_pairs)先转成列表再处理
内容的提问来源于stack exchange,提问作者eternity1
相关产品推荐
相关产品推荐

