Python 在数据帧上循环以对另一个数据帧进行上限和求和
我试图使用来自df1的条目来限制df2中的金额,然后根据它们的类型将它们相加,并在df3中汇总。我不知道如何获得它,使用iterrows的for循环是我最好的猜测,但它并不完整 代码:Python 在数据帧上循环以对另一个数据帧进行上限和求和,python,pandas,dataframe,Python,Pandas,Dataframe,我试图使用来自df1的条目来限制df2中的金额,然后根据它们的类型将它们相加,并在df3中汇总。我不知道如何获得它,使用iterrows的for循环是我最好的猜测,但它并不完整 代码: 通过广播到2d数组a,使用numpy将所有值与大写金额进行比较,然后通过构造函数使用每列总和创建数据帧,并通过和进行转置 对于聚合列,用于具有以下内容的第一列: 通过广播到2d数组a,使用numpy将所有值与大写金额进行比较,然后通过构造函数使用每列总和创建数据帧,并通过和进行转置 对于聚合列,用于具有以下内容的
通过广播到2d数组a,使用numpy将所有值与大写金额进行比较,然后通过构造函数使用每列总和创建数据帧,并通过和进行转置 对于聚合列,用于具有以下内容的第一列:
通过广播到2d数组a,使用numpy将所有值与大写金额进行比较,然后通过构造函数使用每列总和创建数据帧,并通过和进行转置 对于聚合列,用于具有以下内容的第一列:
这是我没有numpy的解决方案,但是它比@jezrael的解决方案慢两倍,10.5ms比5.07ms
limcols= df1.Caps.to_list()
df2=df2.reindex(columns=["Amounts","Type"]+limcols)
df2[limcols]= df2[limcols].transform( \
lambda sc: np.where(df2.Amounts.le(sc.name),df2.Amounts,sc.name))
# Summations:
g=df2.groupby("Type")
df3= g[limcols].sum()
df3.insert(0,"Total", g.Amounts.sum())
# Renaming columns:
c_dic={ lim:f"{lim:.0f}limit" for lim in limcols}
df3= df3.rename(columns=c_dic).reset_index()
# Cleanup:
#df2=df2.drop(columns=limcols)
这是我没有numpy的解决方案,但是它比@jezrael的解决方案慢两倍,10.5ms比5.07ms
limcols= df1.Caps.to_list()
df2=df2.reindex(columns=["Amounts","Type"]+limcols)
df2[limcols]= df2[limcols].transform( \
lambda sc: np.where(df2.Amounts.le(sc.name),df2.Amounts,sc.name))
# Summations:
g=df2.groupby("Type")
df3= g[limcols].sum()
df3.insert(0,"Total", g.Amounts.sum())
# Renaming columns:
c_dic={ lim:f"{lim:.0f}limit" for lim in limcols}
df3= df3.rename(columns=c_dic).reset_index()
# Cleanup:
#df2=df2.drop(columns=limcols)
如何计算a的25limit和100limit?我查找df2中所有对应于“a”的值,主要是45和85,然后将它们相应地限制为25和100,并将它们相加。25+25=50表示25个极限,45+85=130表示100个极限。如何计算a的25个极限和100个极限?我在df2中查找所有对应于“a”的值,主要是45和85,然后将它们相应地限制为25和100,并将它们相加。因此25+25=50表示25极限,45+85=130表示100极限。
df1['Caps'] = df1['Caps'].astype(int)
df2['Amounts'] = df2['Amounts'].astype(int)
am = df2['Amounts'].to_numpy()
ca = df1['Caps'].to_numpy()
#pandas below 0.24
#am = df2['Amounts'].values
#ca = df1['Caps'].values
a = np.where(am <= ca[:, None], am[None, :], ca[:, None])
df1 = (pd.DataFrame(a,columns=df2['Type'],index=df1['Caps'])
.sum(axis=1, level=0).T.add_suffix('limit'))
df1.insert(0, 'Total', df2.groupby('Type')['Amounts'].sum())
df1 = df1.reset_index().rename_axis(None, axis=1)
print (df1)
Type Total 25limit 50limit 100limit
0 a 130 50 95 130
1 b 195 75 125 190
2 c 35 25 35 35
3 d 80 25 50 80
limcols= df1.Caps.to_list()
df2=df2.reindex(columns=["Amounts","Type"]+limcols)
df2[limcols]= df2[limcols].transform( \
lambda sc: np.where(df2.Amounts.le(sc.name),df2.Amounts,sc.name))
# Summations:
g=df2.groupby("Type")
df3= g[limcols].sum()
df3.insert(0,"Total", g.Amounts.sum())
# Renaming columns:
c_dic={ lim:f"{lim:.0f}limit" for lim in limcols}
df3= df3.rename(columns=c_dic).reset_index()
# Cleanup:
#df2=df2.drop(columns=limcols)