【问题标题】:Reshape long to wide using columns names使用列名从长到宽重塑
【发布时间】:2019-11-18 02:05:05
【问题描述】:

您好,我无法重塑我的 df。

我有:

Netflix     TV      DVD 
   0.1      0.2     0.3
   0.12     0.5     0.15
   0.4      0.6     0.8
            0.5     0.41
            0.41
            0.2 

我想将我的 df 转换为:

Netflix  [0.1, 0.12, 0.4]
TV       [0.2, 0.5, 0.6, 0.5, 0.41, 0.2] 
DVD      [0.3, 0.15, 0.8, 0.41]

不确定 stack()pivot() 如何在此类 df 上工作。任何帮助表示赞赏。

【问题讨论】:

  • df.transpose() ?
  • 所以你想把每一列变成列表?
  • 您的 pandas df 如何拥有不同大小的列? Netflix 和 DVD 中的缺失值是 NaN 还是 None ?
  • @OlivierG 是的,它们是 NaN,我想创建一个没有这些 NaN 值的列表。
  • 在这种情况下,没有。只有 24 列包含约 100 行数据。

标签: python pandas numpy reshape


【解决方案1】:

通过Series.dropna 删除缺失值并在字典理解中转换为Series:

s = pd.Series({x: df[x].dropna().tolist() for x in df.columns})
print (s)
Netflix                   [0.1, 0.12, 0.4]
TV         [0.2, 0.5, 0.6, 0.5, 0.41, 0.2]
DVD                 [0.3, 0.15, 0.8, 0.41]
dtype: object

...或DataFrame.apply:

s = df.apply(lambda x: x.dropna().tolist())
print (s)

Netflix                   [0.1, 0.12, 0.4]
TV         [0.2, 0.5, 0.6, 0.5, 0.41, 0.2]
DVD                 [0.3, 0.15, 0.8, 0.41]
dtype: object

如果需要,最后 2 列 DataFrame:

df1 = s.rename_axis('a').reset_index(name='b')
print (df1)
         a                                b
0  Netflix                 [0.1, 0.12, 0.4]
1       TV  [0.2, 0.5, 0.6, 0.5, 0.41, 0.2]
2      DVD           [0.3, 0.15, 0.8, 0.41]

【讨论】:

  • 高尔夫形式的理解答案pd.Series({k: [*df[k].dropna()] for k in df})
【解决方案2】:

我想这就是你要找的:

> df.T.apply(lambda x: x.dropna().tolist(), axis=1)

Netflix    [0.1, 0.12, 0.4, 0.5, 0.41, 0.2]
TV                    [0.2, 0.5, 0.6, 0.41]
DVD                        [0.3, 0.15, 0.8]
dtype: object

【讨论】:

    【解决方案3】:

    如果每列中的缺失值都是 NaN,则可以这样:

    df1 = pd.DataFrame({
        "Netflix":  [0.1, 0.12, 0.4, None, None, None],
        "TV":       [0.2, 0.5, 0.6, 0.5, 0.41, 0.2],
        "DVD":      [0.3, 0.15, 0.8, 0.41, None, None]
    }
    )
    print(df1)
    
    df2 = pd.DataFrame(df1.columns, columns=["Type"])
    df2["List_for_Type"] = [
        list(df1[f].dropna())
        for f in df1.columns
    ]
    print(df2)
    

    对应的输出是:

      Netflix    TV   DVD
    0     0.10  0.20  0.30
    1     0.12  0.50  0.15
    2     0.40  0.60  0.80
    3      NaN  0.50  0.41
    4      NaN  0.41   NaN
    5      NaN  0.20   NaN
    
          Type                    List_for_Type
    0  Netflix                 [0.1, 0.12, 0.4]
    1       TV  [0.2, 0.5, 0.6, 0.5, 0.41, 0.2]
    2      DVD           [0.3, 0.15, 0.8, 0.41]
    

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      stack

      在重塑数组时堆叠丢弃空值

      df.stack().groupby(level=1).agg(list)
      
      DVD                 [0.3, 0.15, 0.8, 0.41]
      Netflix                   [0.1, 0.12, 0.4]
      TV         [0.2, 0.5, 0.6, 0.5, 0.41, 0.2]
      dtype: object
      

      【讨论】:

        【解决方案5】:

        groupbycolumns 一起使用

        df.groupby(level=0,axis=1).apply(lambda x : x.dropna().iloc[:,0].tolist())
        Out[20]: 
        DVD                 [0.3, 0.15, 0.8, 0.41]
        Netflix                   [0.1, 0.12, 0.4]
        TV         [0.2, 0.5, 0.6, 0.5, 0.41, 0.2]
        dtype: object
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-30
          • 2019-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-19
          • 2016-04-11
          • 1970-01-01
          相关资源
          最近更新 更多