【问题标题】:How can I replicate rows in Pandas?如何在 Pandas 中复制行?
【发布时间】:2018-11-20 03:49:59
【问题描述】:

我的 pandas 数据框如下所示:

   Person  ID   ZipCode   Gender
0  12345   882  38182     Female
1  32917   271  88172     Male
2  18273   552  90291     Female

我想将每一行复制 3 次,例如:

   Person  ID   ZipCode   Gender
0  12345   882  38182     Female
0  12345   882  38182     Female
0  12345   882  38182     Female
1  32917   271  88172     Male
1  32917   271  88172     Male
1  32917   271  88172     Male
2  18273   552  90291     Female
2  18273   552  90291     Female
2  18273   552  90291     Female

当然,将索引重置为:

0
1
2
...

我尝试了以下解决方案:

pd.concat([df[:5]]*3, ignore_index=True)

还有:

df.reindex(np.repeat(df.index.values, df['ID']), method='ffill')

但它们都不起作用。

【问题讨论】:

  • 我认为索引是自动生成的。除非您将其设为数据框的字段,否则无法更改。无论如何,它是一个索引。必须是独一无二的。
  • pd.concat([df[:5]]*3, ignore_index=True) 为我工作,你能显示你的 df.index 吗,如果你的索引有问题,下面的解决方案可能不起作用。
  • 对不起,我会澄清一下,pd.concat([df[:5]]*3, ignore_index=True) 有效,但它将行添加到数据帧的末尾,而不是一个接一个地有 3 个重复的行 `

标签: python pandas dataframe repeat


【解决方案1】:

使用np.repeat:

版本 1:

尝试使用np.repeat

newdf = pd.DataFrame(np.repeat(df.values, 3, axis=0))
newdf.columns = df.columns
print(newdf)

上面的代码会输出:

  Person   ID ZipCode  Gender
0  12345  882   38182  Female
1  12345  882   38182  Female
2  12345  882   38182  Female
3  32917  271   88172    Male
4  32917  271   88172    Male
5  32917  271   88172    Male
6  18273  552   90291  Female
7  18273  552   90291  Female
8  18273  552   90291  Female

np.repeat 重复df3 的值。

然后我们添加分配new_df.columns = df.columns的列。

版本 2:

您也可以在第一行指定列名,如下所示:

newdf = pd.DataFrame(np.repeat(df.values, 3, axis=0), columns=df.columns)
print(newdf)

上面的代码也会输出:

  Person   ID ZipCode  Gender
0  12345  882   38182  Female
1  12345  882   38182  Female
2  12345  882   38182  Female
3  32917  271   88172    Male
4  32917  271   88172    Male
5  32917  271   88172    Male
6  18273  552   90291  Female
7  18273  552   90291  Female
8  18273  552   90291  Female

【讨论】:

    【解决方案2】:

    这些将重复索引并保留操作演示的列

    iloc 版本 1

    df.iloc[np.arange(len(df)).repeat(3)]
    

    iloc 第 2 版

    df.iloc[np.arange(len(df) * 3) // 3]
    

    【讨论】:

    • 这对于具有 MultiIndex 值的数据帧来说就像一个魅力,而接受的解决方案似乎并非如此。后者无法处理 MultiIndexing。
    【解决方案3】:

    使用concat

    pd.concat([df]*3).sort_index()
    Out[129]: 
       Person   ID  ZipCode  Gender
    0   12345  882    38182  Female
    0   12345  882    38182  Female
    0   12345  882    38182  Female
    1   32917  271    88172    Male
    1   32917  271    88172    Male
    1   32917  271    88172    Male
    2   18273  552    90291  Female
    2   18273  552    90291  Female
    2   18273  552    90291  Female
    

    【讨论】:

      【解决方案4】:

      你可以这样做。

      def do_things(df, n_times):
          ndf = df.append(pd.DataFrame({'name' : np.repeat(df.name.values, n_times) }))
          ndf = ndf.sort_values(by='name')
          ndf = ndf.reset_index(drop=True)
          return ndf
      
      if __name__ == '__main__':
          df = pd.DataFrame({'name' : ['Peter', 'Quill', 'Jackson']}) 
          n_times = 3
          print do_things(df, n_times)
      

      还有解释...

      import pandas as pd
      import numpy as np
      
      n_times = 3
      df = pd.DataFrame({'name' : ['Peter', 'Quill', 'Jackson']})
      #       name
      # 0    Peter
      # 1    Quill
      # 2  Jackson
      
      #   Duplicating data.
      df = df.append(pd.DataFrame({'name' : np.repeat(df.name.values, n_times) }))
      #       name
      # 0    Peter
      # 1    Quill
      # 2  Jackson
      # 0    Peter
      # 1    Peter
      # 2    Peter
      # 3    Quill
      # 4    Quill
      # 5    Quill
      # 6  Jackson
      # 7  Jackson
      # 8  Jackson
      
      #   The DataFrame is sorted by 'name' column.
      df = df.sort_values(by=['name'])
      #       name
      # 2  Jackson
      # 6  Jackson
      # 7  Jackson
      # 8  Jackson
      # 0    Peter
      # 0    Peter
      # 1    Peter
      # 2    Peter
      # 1    Quill
      # 3    Quill
      # 4    Quill
      # 5    Quill
      
      #   Reseting the index.
      #   You can play with drop=True and drop=False, as parameter of `reset_index()`
      df = df.reset_index()
      #     index     name
      # 0       2  Jackson
      # 1       6  Jackson
      # 2       7  Jackson
      # 3       8  Jackson
      # 4       0    Peter
      # 5       0    Peter
      # 6       1    Peter
      # 7       2    Peter
      # 8       1    Quill
      # 9       3    Quill
      # 10      4    Quill
      # 11      5    Quill
      

      【讨论】:

        【解决方案5】:

        你可以试试下面的代码:

        df = df.iloc[df.index.repeat(3),:].reset_index()
        

        df.index.repeat(3) 将创建一个列表,其中每个索引值将重复 3 次,df.iloc[df.index.repeat(3),:] 将帮助生成一个数据框,其中的行与此列表返回的行完全相同。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-09
          • 2017-01-22
          • 2015-01-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多