我是新来的熊猫和寻求一些建议,在一个棘手的枢轴表操纵请
我有两张桌子和一本字典。第一个透视表的某些值为零。第二个透视表具有相同的因子和级别,但值不同。字典是每个因素的所有可能级别对的集合。示例代码:
df = pd.DataFrame({'MyColumn1': ['A', 'A', 'B', 'B'],
'MyColumn2': ['M', 'N', 'M', 'P'],
'Value': [1, 1, 1, 1]})
table = pd.pivot_table(df, values='Value', index=['MyColumn1', 'MyColumn2'], aggfunc=np.sum, fill_value = 0, dropna = False)
df2 = pd.DataFrame({'MyColumn1': ['A', 'A', 'A', 'B', 'B', 'B'],
'MyColumn2': ['M', 'N', 'P', 'M', 'N', 'P'],
'Value': [5, 10, 15, 20, 25, 30]})
table2 = pd.pivot_table(df2, values='Value', index=['MyColumn1', 'MyColumn2'], aggfunc=np.sum)
myDictionary = {'MyColumn1': {('A', 'A'): 10, ('A', 'B'): 20,
('B', 'A'): 30, ('B', 'B'): 40},
'MyColumn2': {('M', 'M'): 1, ('M', 'N'): 2, ('M', 'P'): 3,
('N', 'M'): 4, ('N', 'N'): 5, ('N', 'P'): 6,
('P', 'M'): 7, ('P', 'N'): 8, ('P', 'P'): 9}}
此代码生成以下表格:
TABLE Value
MyColumn1 MyColumn2
A M 1
N 1
P 0
B M 1
N 0
P 1
TABLE2 Value
MyColumn1 MyColumn2
A M 5
N 10
P 15
B M 20
N 25
P 30
对于Table
中的每个非零项,我想(1)遍历Table
中的每个零项,找到myDictionary中对应于零项键和非零项键的数字的乘积,(2)将每个乘积乘以Table2
中对应于零行的值,然后(3)求这些乘积的和
例如,根据上述数据,算法将计算:
(A, P) -> (A, M) = 10 * 7 = 70, 70 * 15 = 1050
(A, P) -> (A, N) = 10 * 8 = 80, 80 * 15 = 1200
(A, P) -> (B, M) = 20 * 7 = 140, 140 * 15 = 2100
(A, P) -> (B, P) = 20 * 9 = 180, 180 * 15 = 2700
(B, N) -> (A, M) = 30 * 4 = 120, 120 * 25 = 3000
(B, N) -> (A, N) = 30 * 5 = 150, 150 * 25 = 3750
(B, N) -> (B, M) = 40 * 4 = 160, 160 * 25 = 4000
(B, N) -> (B, P) = 40 * 6 = 240, 240 * 25 = 6000
前四行对应于Table
中的第一个零条目,后四行对应于第二个零条目。有四行,因为有四个非零条目。接下来,算法乘以Table2
中的相应值。最后,每一个非零条目的总和为:
(A, M) total = 1050 + 3000 = 4050
(A, N) total = 1200 + 3750 = 4950
(B, M) total = 2100 + 4000 = 6100
(B, P) total = 2700 + 6000 = 8700
理想的结果是一个与原始表形状相同的透视表,但将这些总和作为值
Value
MyColumn1 MyColumn2
A M 4050
N 4950
P 0
B M 6100
N 0
P 8700
我正在寻找一种有效的方法,因为在实践中,我将有100000+零个条目,<;1000个非零条目和~10列。出于性能原因,我不知道如何构造循环,甚至不知道循环是否是最有效的方法。任何帮助都将不胜感激,谢谢:)
不确定这对您的实际数据有多快,但我会这样做:
输出:
相关问题 更多 >
编程相关推荐