pandas Vlookup值并汇总

voase2hg  于 2023-05-12  发布在  其他
关注(0)|答案(2)|浏览(111)

我有一个独特的数据框架有一个卖方名称列表。下面是样本。
DF_主卖方
| 卖家|
| --------------|
| 哈日|
| 奥姆|
| 猫|
| 垫|
| 约翰|
| 梅西|
| 约翰|
| 罗纳尔多|
| 香农|
| 凯蒂|
| 雷|
我有多个 Dataframe -
DF1
| 卖家|沃勒|日期|评级|
| --------------|--------------|--------------|--------------|
| 哈日|二|2002年1月|4.2|
| 奥姆|十二岁|2002年1月|3.4|
| 猫|0| 2002年1月|4.3|
| 垫|十四岁|2002年1月|4.3|
DF2
| 卖家|沃勒|日期|评级|
| --------------|--------------|--------------|--------------|
| 哈日|二百二十二|02年10月|四个|
| 奥姆|一百二十|02年10月|三|
| 猫|10个|02年10月|2.3|
| 垫|一百四十三|02年10月|二点五|
| 约翰|三十|02年10月|4.3|
DF3
| 卖家|沃勒|日期|评级|
| --------------|--------------|--------------|--------------|
| 雷|二十二|2002年2月|2.4|
| 杰伊|十二岁|2002年2月|二点五|
| 索汉|0| 2002年2月|2.2|
| 垫|一百四十四|2002年2月|五|
| 约翰|10个|2002年2月|3.4|
在DF_Master_seller中搜索每个 Dataframe ,为每个匹配项获取值并计算最后的总数。
最终DF
| 卖家|数值_2002年1月|数值_2002年2月|价值_2002年10月|
| --------------|--------------|--------------|--------------|
| 哈日|二||二百二十二|
| 奥姆|十二岁||一百二十|
| 猫|0||10个|
| 垫|十四岁|一百四十四|一百四十三|
| 约翰|||三十|
| 梅西||||
| 约翰||10个||
| 罗纳尔多||||
| 香农||||
| 凯蒂||||
| 雷||二十二||
|合计|28|176| 515号|
注-列应按日期排序

xam8gpfp

xam8gpfp1#

与@Corralien的方法相同,但使用margins和排序列:

out = (pd.concat([df1, df2, df3])
        .pivot_table(index="Seller", values="Vaule", columns="Date",
                     aggfunc="sum", margins=True, margins_name="Total", sort=False)
        .drop(columns="Total").reindex(list(df["Seller"]) + ["Total"])
        .sort_index(key= lambda x: pd.to_datetime(x, format="%b-%d"), axis=1)
        .add_prefix("Value").reset_index().rename_axis(columns=None)
)

输出:

print(out)

     Seller  Value_Jan-02  Value_Feb-02  Value_Oct-02
0      Hari          2.00           NaN        222.00
1        Om         12.00           NaN        120.00
2       Cat          0.00           NaN         10.00
3       Mat         14.00        144.00        143.00
4      John           NaN         10.00         30.00
5     Messi           NaN           NaN           NaN
6      John           NaN         10.00         30.00
7   Ronaldo           NaN           NaN           NaN
8   Shannon           NaN           NaN           NaN
9    Catthy           NaN           NaN           NaN
10      Ray           NaN         22.00           NaN
11    Total         28.00        188.00        525.00
bvjveswy

bvjveswy2#

您可以使用pd.concat合并df1df2df3,然后按主 Dataframe 的Seller列重新索引(dfM):

# 1st pass: aggregate all dataframes whatever the dates
out = (pd.concat([df1, df2, df3])
         .pivot_table(index='Seller', columns='Date', values='Vaule', 
                      sort=False, fill_value=0)
         .reindex(dfM['Seller'], fill_value=0))

# 2nd pass: reorganize the output
out = (pd.concat([out, out.sum().to_frame('Total').T])
         .sort_index(axis=1, key=lambda x: pd.to_datetime(x, format='%b-%y'))
         .add_prefix('Value_').rename_axis(index='Seller', columns=None).reset_index())

输出:

>>> out
     Seller  Value_Jan-02  Value_Feb-02  Value_Oct-02
0      Hari             2             0           222
1        Om            12             0           120
2       Cat             0             0            10
3       Mat            14           144           143
4      John             0            10            30
5     Messi             0             0             0
6      John             0            10            30
7   Ronaldo             0             0             0
8   Shannon             0             0             0
9    Catthy             0             0             0
10      Ray             0            22             0
11    Total            28           186           555

相关问题