我正在尝试通过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)
答案 0 :(得分:2)
对于一般解决方案,两个新列在num
中的值也重叠,请使用:
想法是针对df1
和fw
值的过滤器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)
您可以尝试使用melt
,merge
和groupby
的组合来重塑数据并获得总和:
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