【问题标题】:Vectorised method to append dataframe rows to columns and vice-versa将数据帧行附加到列的矢量化方法,反之亦然
【发布时间】:2020-05-09 12:18:54
【问题描述】:

我的数据框如下:

df = pd.DataFrame({'a': {'d': 1, 'e': 0, 'f': 1, 'g': 1},
                   'b': {'d': 0, 'e': 0, 'f': 0, 'g': 1},
                   'c': {'d': 0, 'e': 1, 'f': 1, 'g': 0}})

给出:

>>> df
   a  b  c
d  1  0  0
e  0  0  1
f  1  0  1
g  1  1  0

对于数据框中的每一行,我想添加一个新的 0s 列,对于数据框中的每一列,我想添加一个新的 0s 行。

到目前为止,我已尝试通过以下方式解决此问题:

edges = df.columns

for i in df.index:
    df[i] = [0 for _ in range(len(df.index))]

for e in edges:
    df = df.append(pd.Series({c:0 for c in df.columns},name=e))

这会产生所需的输出:

>>> df
   a  b  c  d  e  f  g
d  1  0  0  0  0  0  0
e  0  0  1  0  0  0  0
f  1  0  1  0  0  0  0
g  1  1  0  0  0  0  0
a  0  0  0  0  0  0  0
b  0  0  0  0  0  0  0
c  0  0  0  0  0  0  0

是否有矢量化替代方案?

【问题讨论】:

    标签: python python-3.x pandas dataframe vectorization


    【解决方案1】:

    fromkeys 创建一个字典,然后解压,然后使用assignT 然后assign 然后T

    print(df.assign(**dict.fromkeys(df.index, 0)).T.assign(**dict.fromkeys(df.columns, 0)).T)
    

    输出:

       a  b  c  d  e  f  g
    d  1  0  0  0  0  0  0
    e  0  0  1  0  0  0  0
    f  1  0  1  0  0  0  0
    g  1  1  0  0  0  0  0
    a  0  0  0  0  0  0  0
    b  0  0  0  0  0  0  0
    c  0  0  0  0  0  0  0
    

    【讨论】:

      【解决方案2】:

      使用DataFrame.reindexcolumnsindex参数,新值应该由Index.append创建:

      df1 = df.reindex(columns=df.columns.append(df.index), 
                       index=df.index.append(df.columns), 
                       fill_value = 0)
      print (df1)
         a  b  c  d  e  f  g
      d  1  0  0  0  0  0  0
      e  0  0  1  0  0  0  0
      f  1  0  1  0  0  0  0
      g  1  1  0  0  0  0  0
      a  0  0  0  0  0  0  0
      b  0  0  0  0  0  0  0
      c  0  0  0  0  0  0  0
      

      Index.union:

      df1 = df.reindex(columns=df.columns.union(df.index, sort=False), 
                       index=df.index.union(df.columns, sort=False), 
                       fill_value = 0)
      print (df1)
         a  b  c  d  e  f  g
      a  0  0  0  0  0  0  0
      b  0  0  0  0  0  0  0
      c  0  0  0  0  0  0  0
      d  1  0  0  0  0  0  0
      e  0  0  1  0  0  0  0
      f  1  0  1  0  0  0  0
      g  1  1  0  0  0  0  0
      

      【讨论】:

        【解决方案3】:

        这是使用reindex的一种方式:

        (df.reindex(df.columns.append(df.index), 
                   axis=1, 
                   fill_value =0)
          .reindex(df.index.append(df.columns), 
                   axis=0, 
                   fill_value =0))
        

        print(df_new)
        
           a  b  c  d  e  f  g
        d  1  0  0  0  0  0  0
        e  0  0  1  0  0  0  0
        f  1  0  1  0  0  0  0
        g  1  1  0  0  0  0  0
        a  0  0  0  0  0  0  0
        b  0  0  0  0  0  0  0
        c  0  0  0  0  0  0  0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-28
          • 2022-11-06
          • 2017-05-17
          • 1970-01-01
          相关资源
          最近更新 更多