Pandas生成笛卡尔积DataFrame遇KeyError问题求助
问题分析与解决
错误原因
- merge参数错误:你写的
left_on=['Marketprice', "m2"]里,m2列在df中根本不存在;right_on=['Marketprice', "m2"]里,Marketprice列在df1中也不存在,这就是触发KeyError的直接原因。 - 方法用错:你要的是三个数组的笛卡尔积(每个Marketprice值和所有m2、rent值逐一组合),但
merge默认是基于共同列做匹配关联,不是生成全组合的工具。
正确解法
解法1:用临时辅助列实现笛卡尔积
给每个DataFrame加一个相同值的临时列,通过这个列做全匹配merge,最后删掉临时列:
import numpy as np import pandas as pd marketPrice = np.arange(50000, 300000, 1000) m2 = np.arange(25, 180, 1) rent = np.arange(500, 900, 1) df = pd.DataFrame(data=marketPrice, columns=["Marketprice"]) df1 = pd.DataFrame(data=m2, columns=["m2"]) df2 = pd.DataFrame(data=rent, columns=["rent"]) # 添加临时辅助列 df['tmp'] = 1 df1['tmp'] = 1 df2['tmp'] = 1 # 先合并df和df1,再合并df2 result = df.merge(df1, on='tmp').merge(df2, on='tmp').drop('tmp', axis=1) print(result)
解法2:用MultiIndex直接生成全组合(更简洁)
利用pd.MultiIndex.from_product直接生成所有值的组合,再转成DataFrame:
import numpy as np import pandas as pd marketPrice = np.arange(50000, 300000, 1000) m2 = np.arange(25, 180, 1) rent = np.arange(500, 900, 1) # 生成笛卡尔积索引,转成DataFrame result = pd.DataFrame( index=pd.MultiIndex.from_product([marketPrice, m2, rent], names=['Marketprice', 'm2', 'rent']) ).reset_index() print(result)
注意:两种方法生成的结果行数为len(marketPrice)*len(m2)*len(rent),计算得250155400=15,500,000行,数据量较大,运行时注意内存占用情况。
内容的提问来源于stack exchange,提问作者Carol.Kar
相关产品推荐
相关产品推荐

