【问题标题】:Displaying and Visualizing Difference between two dataframes显示和可视化两个数据框之间的差异
【发布时间】:2019-12-07 00:03:23
【问题描述】:

我有两个不同时间段的数据帧 - df_period_a with

Vendor      Market
VendorA     MarketA
VendorA     MarketB
VendorX     MarketB
VendorZ     MarketB
VendorC     MarketX
VendorB     MarketX
VendorB     MarketA
VendorD     MarketA

和df_period_b 一样-

Vendor      Market
VendorA     MarketB
VendorX     MarketB
VendorZ     MarketB
VendorC     MarketB
VendorB     MarketX
VendorD     MarketX
VendorE     MarketB
VendorF     MarketC

这意味着MarketA 已经关闭,并且出现了一个新市场MarketC,以及一些新的供应商E 和F。我想用df_diff 来展示这一点以及供应商在市场之间的变动(如果有的话) -

Source        Destination    Value
MarketX1        MarketX2        1
MarketA1        MarketX2        1
MarketB1        MarketX2        0
MarketX1        MarketB2        1
MarketB1        MarketB2        3
  -             MarketC2        1
  -             MarketB2        1

这里的Value 等于在a 期间从source 市场转移到b 期间destination 市场的供应商数量。

我尝试过的东西不太准确 -

def get_vendor_displacement_count(market_list, df_before, df_after):
    for market in market_list:
        df_moved_vendors = pd.merge(df_before, df_after, on=['Vendor'], how='inner')
        df_moved_vendors.rename(columns={'Market_x':'Source', 'Market_y':'Target'}, inplace=True)
        df_moved_vendors['Source'] = dict_periods[len(market_list)+1]  + " " +  df_moved_vendors['Source'].astype(str)
        df_moved_vendors['Target'] = dict_periods[len(market_list)] + " " + df_moved_vendors['Target'].astype(str)
    return df_moved_vendors

另外,桑基图(ipysankeywidget) 是显示这种位移的最合适的图,还是我也可以看看其他的可视化?谢谢!

【问题讨论】:

  • “值”列中的那些值表示什么?我猜来源和目的地分别是 period_a 和 period_b 的供应商?什么是“MarketX1”而不是“MarketX2”?
  • 尝试为此编写一些代码,即使它看起来很糟糕或很慢等等。发布该代码,以便我们为您提供帮助。 “我还可以看看其他可视化”的问题在本网站上是题外话,因为它是基于意见的、民意调查和征求建议的。
  • 谢谢@JohnZwinck 和 jeremy_rutman .. 我已经做了一些相应的修改

标签: python pandas dataframe data-visualization


【解决方案1】:

你可以这样做:

dfa1 = df_period_a.assign(Value=1).set_index(['Vendor','Market'])
dfb1 = df_period_b.assign(Value=1).set_index(['Vendor','Market'])
diff = dfa1.join(dfb1, how='outer', lsuffix='a', rsuffix='b').fillna(0).astype(int)
res = (diff.Valueb - diff.Valuea).rename('Change').reset_index().query('Change != 0')

结果:

    Vendor   Market  Change
0  VendorA  MarketA      -1
2  VendorB  MarketA      -1
4  VendorC  MarketB       1
5  VendorC  MarketX      -1
6  VendorD  MarketA      -1
7  VendorD  MarketX       1
8  VendorE  MarketB       1
9  VendorF  MarketC       1

-1 表示供应商离开了该市场,1 表示他进入了该市场。根据您关注的内容,您可以按三列中的任意一列对结果进行进一步排序。


更新:简单的可视化为热图(绿色 = 供应商进入市场;黄色 = 没有变化,供应商留在市场;红色 = 供应商离开市场;白色(背景)= 无数据(供应商在该市场不活跃, 既不在时期 a 也不在时期 b)):
import pandas as pd
import matplotlib
import seaborn as sns

df_period_a = pd.DataFrame( {'Vendor': map('Vendor{}'.format, list('AAXZCBBD')),'Market': map('Market{}'.format, list('ABBBXXAA'))})
df_period_b = pd.DataFrame( {'Vendor': map('Vendor{}'.format, list('AXZCBDEF')),'Market': map('Market{}'.format, list('BBBBXXBC'))})

dfa1 = df_period_a.assign(Value=1).set_index(['Vendor','Market'])
dfb1 = df_period_b.assign(Value=1).set_index(['Vendor','Market'])
diff = dfa1.join(dfb1, how='outer', lsuffix='a', rsuffix='b').fillna(0).astype(int)
res = (diff.Valueb - diff.Valuea).rename('Change').reset_index()

cmap = matplotlib.colors.ListedColormap(['red','yellow','green'])
ax = sns.heatmap(res.pivot_table('Change', 'Vendor', 'Market'), cmap=cmap)
cb = ax.collections[0].colorbar
cb.set_ticks([-.67, 0, .67])
cb.set_ticklabels(['left', 'stayed', 'entered'])
sns.despine(left=False, bottom=False, top=False, right=False)
matplotlib.pyplot.show()

【讨论】:

  • 对于可视化,this survey 可能有用。
  • 关于哪些可视化选项可能对可视化上述结果有用的任何建议?
猜你喜欢
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2011-08-31
  • 2018-04-18
  • 2020-10-12
  • 2023-03-26
相关资源
最近更新 更多