【问题标题】:Pivot Pandas Column of ListsPivot Pandas 列表的列
【发布时间】:2020-11-12 15:36:13
【问题描述】:

我有一个 pandas 数据框,它有一列的值是列表,另一列是日期。我想创建一个按日期计算列表元素的数据框。

数据框如下所示:

pd.DataFrame(
    data={
        "col1": ["['a','b']", "['b','c']", "['a','c']", "", "['b']"],
        "col2": ["2020-01-01", "2020-01-02", "2020-01-03", "2020-01-04", "2020-01-05"],
    },
    index=[0, 1, 2, 3, 4],
)

我希望数据框看起来像:

pd.DataFrame(
    data={"a": [1, 0, 1, 0, 0], "b": [1, 1, 0, 0, 1], "c": [0, 1, 1, 0, 0]},
    index=["2020-01-01", "2020-01-02", "2020-01-03", "2020-01-04", "2020-01-05"],
)

对如何进行这种转换有什么想法吗?

【问题讨论】:

    标签: python pandas list dataframe pivot-table


    【解决方案1】:

    您可以在此处使用pd.crosstab

    df['col1'] = df['col1'].str.findall('\w+')
    df_ = df.explode('col1')
    pd.crosstab(df_['col2'], df_['col1']).reindex(df_['col2'].unique()).fillna(0)
    
    col1          a    b    c
    col2                     
    2020-01-01  1.0  1.0  0.0
    2020-01-02  0.0  1.0  1.0
    2020-01-03  1.0  0.0  1.0
    2020-01-04  0.0  0.0  0.0
    2020-01-05  0.0  1.0  0.0
    

    【讨论】:

      【解决方案2】:

      你可以使用extractall提取''里面的值,然后用groupby计算值:

      out= (df.col1.str.extractall("'([^']*)'")
         .groupby(level=0)[0].value_counts()
         .unstack(level=1,fill_value=0)
         .reindex(df.index, fill_value=0)
      )
      
      out.index= df['col2']
      print(out)
      

      输出:

      0           a  b  c
      col2               
      2020-01-01  1  1  0
      2020-01-02  0  1  1
      2020-01-03  1  0  1
      2020-01-04  0  0  0
      2020-01-05  0  1  0
      

      【讨论】:

      • 这是一个强有力的答案,谢谢Quang。但是,我应该更清楚 - 在我的数据集中,日期有时会重复,我想对所有出现该日期的变量求和
      • @enixon4 而不是out.index=df['col2']out.groupby(df['col2']).sum() :-)
      【解决方案3】:

      你可以这样做:

      
      df = pd.DataFrame(
          data={
              "col1": [['a','b'], ['b','c'], ['a','c'], ['c'], ['b']],
              "col2": ["2020-01-01", "2020-01-02", "2020-01-03", "2020-01-04", "2020-01-05"],
          }
      )
      df2 = df.explode('col1').reset_index(drop=True)
      df2["value"]=1
      pd.pivot_table(df2, values="value", index=["col2"], columns=["col1"], aggfunc=lambda x: 1, fill_value=0) 
      

      【讨论】:

      • 我认为如果您使用交叉表而不是数据透视表,IMO pd.crosstab(index = df2.col2, columns = df2.col1) 会更好。这也可以让你放弃df2['value'] = 1
      • 是的。我看到了解决方案。不错!
      猜你喜欢
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      相关资源
      最近更新 更多