数据框到桑基图

Dataframe to Sankey Diagram

我想从产品数据生成一个像这样的桑基图。

   id  begin_date   status  
   1   01.02.2020   a       
   1   10.02.2020   b       
   1   17.02.2020   c       
   2   02.02.2020   d       
   2   06.03.2020   b       
   2   17.04.2020   c    

为了您的实验:

pd.DataFrame([[1, '2020-02-01', 'a'], [1, '2020-02-10', 'b'], [1, '2020-02-17', 'c'], [2, '2020-02-02', 'd'], [2, '2020-03-06', 'b'],[2, '2020-04-17', 'c']], columns=['id', 'begin_date', 'status'])

看完这个解释: 我想构建这样的“Source-Target-Value”-Dataframe。为了加深理解,我没有将 Source 和 Target 转换为整数。

# with Source = previous status
# with Target = next status
# with Value = count of IDs that transition from Source to Target
Source  Target      Value      Link Color
     a       b          1      rgba(127, 194, 65, 0.2)
     b       c          2      rgba(127, 194, 65, 0.2)
     d       b          1      rgba(211, 211, 211, 0.5)

问题在于生成Source、Target和Value。 SourceTarget应该是从ab的状态转换。 Value 是执行该转换的 id 的计数。

最好的方法是什么?

编辑:使用在线生成器,结果如下所示:

找到答案了!

# assuming df is sorted by begin_date
import pandas as pd
df = pd.read_csv(r"path")
dfs = []
unique_ids = df["id"].unique()
for uid in unique_ids:
    df_t = df[df["id"] == uid].copy()
    df_t["status_next"] = df_t["status"].shift(-1)
    df_t["status_append"] = df_t["status"] +  df_t["status_next"]
    df_t = df_t.groupby("status_append").agg(Value=("status_append","count")).reset_index()
    dfs.append(df_t)

df = pd.concat(dfs, ignore_index=True)
df = df.groupby("status_append").agg(Value=("Value","sum")).reset_index()

df["Source"] = df['status_append'].astype(str).str[0]
df["Target"] = df['status_append'].astype(str).str[1]
df = df.drop("status_append", axis=1)
df = df[["Source", "Target", "Value"]]

产量

Source  Target  Value
a            b      1
b            c      2
d            b      1