Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在数据帧上循环以对另一个数据帧进行上限和求和_Python_Pandas_Dataframe - Fatal编程技术网

Python 在数据帧上循环以对另一个数据帧进行上限和求和

Python 在数据帧上循环以对另一个数据帧进行上限和求和,python,pandas,dataframe,Python,Pandas,Dataframe,我试图使用来自df1的条目来限制df2中的金额,然后根据它们的类型将它们相加,并在df3中汇总。我不知道如何获得它,使用iterrows的for循环是我最好的猜测,但它并不完整 代码: 通过广播到2d数组a,使用numpy将所有值与大写金额进行比较,然后通过构造函数使用每列总和创建数据帧,并通过和进行转置 对于聚合列,用于具有以下内容的第一列: 通过广播到2d数组a,使用numpy将所有值与大写金额进行比较,然后通过构造函数使用每列总和创建数据帧,并通过和进行转置 对于聚合列,用于具有以下内容的

我试图使用来自df1的条目来限制df2中的金额,然后根据它们的类型将它们相加,并在df3中汇总。我不知道如何获得它,使用iterrows的for循环是我最好的猜测,但它并不完整

代码:


通过广播到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)