在熊猫中使用SUMIF函数

时间:2020-08-18 07:12:59

标签: python pandas dataframe

我正在尝试通过Pandas计算Datafame的值。

但是我无法计算“ FW_result”和“ SS_result”。

df1:
category  num  standard
  FW      U-1    3
  FW      U-2    3
  FW      U-3    2
  SS      U-4    3
  SS      U-5    2


df2:
name    U-1 U-2 U-3 U-4 U-5
 A       3   1   1   2   1
 B       2   3   2   1   2
 C       2   2   2   3   1


The desired result would be: 

name    U-1 U-2 U-3 U-4 U-5 FW_result   SS_Result
 A       3   1   1   2   1     *(63%)       #(60%)
 B       2   3   2   1   2     **(88%)      ##(60%)
 C       2   2   2   3   1     ***(75%)     ###(80%)

我想填写*和#值。 FW_result引用df1,因此(df2 value)/(standard sum)

示例*:

(3+1+1)/(3+3+2) =>63%

示例#:

(2+1) /(3+2)   => 60%

我想将结果表示为%(persent)

3 个答案:

答案 0 :(得分:2)

对于一般解决方案,两个新列在num中的值也重叠,请使用:

想法是针对df1fw值的过滤器ss,然后使用DataFrame.reindex除以num的值,求和并除以原始{{1 }}列:

standard

答案 1 :(得分:2)

如果nums在类别上不重叠,则可以使用它。

您可以在此处使用df.groupby,然后使用GroupBy.sum,然后使用df.div除以这些值,并乘以100以使用df.mul获得百分比值以获得所需的结果

g = df1.groupby('category')['standard'].sum()
m = df2.groupby(df2.columns.map(df1.set_index('num')['category']),axis=1).sum()
               # Mapping to convert U-1 to FW, U-2 to FW based on df1
               # If you know it's always the order as df1 then you can simply
               #_.groupby.(df1['category'].tolist(), axis=1)

df2[['FW_res', 'SS_res']] = m.div(g).mul(100)

如果它们重叠,请尝试一下。

df1
#  category  num  standard
#0       FW  U-1         3
#1       FW  U-2         3
#2       FW  U-3         2
#3       SS  U-4         3
#4       SS  U-5         2
#5       SS  U-1         4
p = df1.pivot_table(index='category', columns='num', values='standard', aggfunc='sum')
p
#num       U-1  U-2  U-3  U-4  U-5
#category
#FW        3.0  3.0  2.0  NaN  NaN
#SS        4.0  NaN  NaN  3.0  2.0

# Now, little bit of Numpy boardcasting.
#df2.se_index('name') # if index is not name else ignore this step.
vs = np.nansum(df2.values[:,None]+p.values, axis=-1)
v = p.sum(axis=1).values
out = (vs - v) / v
df2[['FW_res', 'SS_res']] = pd.DataFrame(out*100, index=df2.index)

答案 2 :(得分:0)

您可以尝试使用meltmergegroupby的组合来重塑数据并获得总和:

df2[['FW_result', 'SS_result']] = (df1.merge(df2.melt("name", var_name="num"), on="num")
                                   .assign(num=lambda x: x.num.str[0])
                                   .groupby(["name", "category", "num"])
                                   .pipe(lambda x: x.value.sum() / x.standard.sum())
                                   .mul(100)
                                   .unstack("category").to_numpy())


  name  U-1 U-2 U-3 U-4 U-5 FW_result   SS_result
0   A   3   1   1   2   1   62.5        60.0
1   B   2   3   2   1   2   87.5        60.0
2   C   2   2   2   3   1   75.0        80.0