我想基于所有子列(Index2)在Index1的列之间执行一个操作,该列由'A'和'B'标识。我有多个日期,即多行。
我所拥有的:
const App = () => {
const [isPopUpActive, setIsPopUpActive] = useState(false);
const popUpOnOff = useCallback(() => {
setIsPopUpActive(!isPopUpActive);
}, [isPopUpActive, setIsPopUpActive]);
return (
<div>
<SomeComponent trigger={popUpOnOff} />
<PopUpComponent isActive={isPopUpActive} />
</div>
);
};
我想要什么:
d = {'Date':'20191101', 'Index1': ['A','A','A','B','B','B'], 'Index2': ['a','b','c','a','b','c'], 'Value':[0,2,0,3,5,4]}
df = pd.DataFrame(data=d)
df = df.pivot_table(index='Date', columns=['Index1','Index2'], values='Value', aggfunc=np.sum)
Index1 A B
Index2 a b c a b c
Date
20191101 0 2 0 3 5 4
您对我如何执行此操作有想法吗?
非常感谢和问候!
编辑: 我现在想执行几个操作,例如A-B + C。输入是A-B + C,我可以执行1个或2个或更多操作,因此我需要一个递归算法。 你有什么主意吗 ?
答案 0 :(得分:0)
这是我的版本。是你的愿望输出吗?
two
答案 1 :(得分:0)
我创建了一个递归函数。 数据包含原始系列A,B和C。 该函数将处理['A-B'],将其添加到数据中,并调用Combine_Indexes(['A-B','C'],['+'],data)。 当ops为空时,递归停止。
data = Combine_Indexes(['A','B','C'], ['-','+'], data)
功能:
def Combine_Indexes(indexes, ops, df):
if len(ops)>0: #there are still operations to do
op = ops[0]
index1 = indexes[0]
index2 = indexes[1]
if op == '-':
data_combined = pd.DataFrame([df[(index1,x)] - df[(index2,x)] for x in df.columns.levels[1]]).T
elif op == '+':
data_combined = pd.DataFrame([df[(index1,x)] + df[(index2,x)] for x in df.columns.levels[1]]).T
data_combined.columns = pd.MultiIndex.from_arrays([[index1 + op + index2]*len(df.columns.levels[1]), df.columns.levels[1]])
data_combined = df.merge(data_combined, left_index=True, right_index=True)
indexes = [index1 + op + index2] + indexes[2:]
return Combine_Indexes(indexes, ops[1:], data_combined) #we call back the function with the new indexes list, ops list and df
else: #no more operation
return df