我有一个 Dataframe 在以下格式与~ 80 K行。
df = pd.DataFrame({'Year': [1900, 1902, 1903], 'Name': ['Tom', 'Dick', 'Harry']})
Year Name
0 1900 Tom
1 1902 Dick
2 1903 Harry
我需要调用一个函数,将name列的每个组合作为参数。目前我正在使用以下代码(用print替换函数调用):
for i, n1 in enumerate(df.itertuples()):
for n2 in df[i:].itertuples():
print(n1.Name, n2.Name)
有什么方法可以加快我所错过的吗?
PS:我需要跟踪每个名称对的索引。所以如果我在索引上运行itertools.combinations,那么我仍然必须进行代价高昂的df.loc调用。
6条答案
按热度按时间djp7away1#
跟踪指数/年份的另一个解决方案是使用交叉连接:
输出:
bvjxkvbb2#
您可以用途:
q8l4jmvw3#
您可以使用
itertools.combinations
:输出:
或者如果您需要更换(编辑:跟踪索引):
输出:
qc6wkl3g4#
如果需要针对
combinations_with_replacement
等输出的panda解决方案,可以使用交叉连接,然后按掩码过滤必要的行:解决方案适用于任何指数:
bgtovc5b5#
受@Tranbi和
combinations_with_replacement
启发的另一种低内存占用方式(避免生成所有组合然后丢弃它们):57hvy0tb6#
基于
numpy.broadcast_arrays
的另一种可能的解决方案是:输出: