【问题标题】:How to explode each row in a Pandas Dataframe into multiple rows如何将 Pandas Dataframe 中的每一行分解为多行
【发布时间】:2019-02-19 04:47:40
【问题描述】:

我有一个函数正在传递一个 pandas 数据帧,并且对于该数据帧中的每一行,我想创建 N 个其他行,除了 2 个列值之外,每一行都等效于原始行。

执行此操作的正确方法是什么 - 尤其是以 RAM 有效的方式?

到目前为止,我的尝试是运行pd.apply,然后为每一行调用一个函数,该函数返回一个pd.Series 对象列表,然后我将调用append 将它们添加到原始@ 987654325@。不过,这还没有成功。

这是我尝试使用一些虚拟代码进行复制的示例:

students = [ ('Jack', 34, 'Sydney' , 'Australia') ,
             ('Jill', 30, 'New York' , 'USA' ) ]

# Create a DataFrame object
df = pd.DataFrame(students, columns = ['Name' , 'Age', 'City' , 'Country'], index=['a', 'b', 'c' , 'd' , 'e' , 'f'])

# function I will use to explode a single row into 10 new rows
def replicate(x):
    new_rows = []
    i = 0
    for j in range(3):
        y = x.copy(deep=True)
        y.Age = i
        i += 1
        new_rows.append(y)
    return new_rows

# Iterate over each row and append the results
df.apply(lambda x: df.append(replicate(x))

对于上述情况,我希望输出如下所示:

Jack, 34, Sydney, Australia
Jack, 0, Sydney, Australia
Jack, 1, Sydney, Australia
Jack, 2, Sydney, Australia
Jill, 30, New York, USA
Jill, 0, New York, USA
Jill, 1, New York, USA
Jill, 2, New York, USA

最后,我希望我的数据框有 N 倍的行,我可以从原始行计算派生行。我想以一种空间有效的方式来做这件事,而这现在还没有发生。任何帮助表示赞赏!

【问题讨论】:

  • 您能否指出您对此输入的预期结果是什么?
  • @DanielLabbe 是的!用预期的输出更新了问题
  • stackoverflow.com/questions/36875648/… 试试看。还有很多类似的问题。
  • @johnnyb 这个问题似乎是将值从一个 df 覆盖到另一个,我认为这与通过派生行扩展当前 df 的长度不同。虽然,也许我错过了你指出的重要内容:)

标签: python pandas


【解决方案1】:

IIUC,您想要np.repeat,使用Age 列指定重复次数,然后在事后修复年龄列。

import pandas as pd

df1 = pd.DataFrame(df.values.repeat(df.Age+1, axis=0), 
                   columns=['Name', 'Age', 'City', 'Country'])
df1['Age'] = (df1.groupby([*df1]).cumcount()-1).where(df1.duplicated(), df1['Age'])

输出df1:

    Name Age      City    Country
0   Jack  34    Sydney  Australia
1   Jack   0    Sydney  Australia
2   Jack   1    Sydney  Australia
3   Jack   2    Sydney  Australia
4   Jack   3    Sydney  Australia
...
34  Jack  33    Sydney  Australia
35  Jill  30  New York        USA
...
63  Jill  27  New York        USA
64  Jill  28  New York        USA
65  Jill  29  New York        USA

[66 rows x 4 columns]

输入df:

   Name  Age      City    Country
a  Jack   34    Sydney  Australia
b  Jill   30  New York        USA

【讨论】:

    【解决方案2】:

    IIUC

    d={x : y.set_index('Age').reindex(range(y['Age'].iloc[0]+1),method='bfill') for x , y in df.groupby(level=0)}
    newdf=pd.concat(d).reset_index(level=1)
    newdf
    Out[220]: 
        Age  Name      City    Country
    a     0  Jack    Sydney  Australia
    a     1  Jack    Sydney  Australia
    a     2  Jack    Sydney  Australia
    a     3  Jack    Sydney  Australia
    a     4  Jack    Sydney  Australia
    a     5  Jack    Sydney  Australia
    a     6  Jack    Sydney  Australia
    a     7  Jack    Sydney  Australia
    a     8  Jack    Sydney  Australia
    a     9  Jack    Sydney  Australia
    a    10  Jack    Sydney  Australia
    a    11  Jack    Sydney  Australia
    a    12  Jack    Sydney  Australia
    a    13  Jack    Sydney  Australia
    a    14  Jack    Sydney  Australia
    a    15  Jack    Sydney  Australia
    a    16  Jack    Sydney  Australia
    a    17  Jack    Sydney  Australia
    a    18  Jack    Sydney  Australia
    a    19  Jack    Sydney  Australia
    a    20  Jack    Sydney  Australia
    a    21  Jack    Sydney  Australia
    a    22  Jack    Sydney  Australia
    a    23  Jack    Sydney  Australia
    a    24  Jack    Sydney  Australia
    a    25  Jack    Sydney  Australia
    a    26  Jack    Sydney  Australia
    a    27  Jack    Sydney  Australia
    a    28  Jack    Sydney  Australia
    a    29  Jack    Sydney  Australia
    ..  ...   ...       ...        ...
    b     1  Jill  New York        USA
    b     2  Jill  New York        USA
    b     3  Jill  New York        USA
    b     4  Jill  New York        USA
    b     5  Jill  New York        USA
    b     6  Jill  New York        USA
    b     7  Jill  New York        USA
    b     8  Jill  New York        USA
    b     9  Jill  New York        USA
    b    10  Jill  New York        USA
    b    11  Jill  New York        USA
    b    12  Jill  New York        USA
    b    13  Jill  New York        USA
    b    14  Jill  New York        USA
    b    15  Jill  New York        USA
    b    16  Jill  New York        USA
    b    17  Jill  New York        USA
    b    18  Jill  New York        USA
    b    19  Jill  New York        USA
    b    20  Jill  New York        USA
    b    21  Jill  New York        USA
    b    22  Jill  New York        USA
    b    23  Jill  New York        USA
    b    24  Jill  New York        USA
    b    25  Jill  New York        USA
    b    26  Jill  New York        USA
    b    27  Jill  New York        USA
    b    28  Jill  New York        USA
    b    29  Jill  New York        USA
    b    30  Jill  New York        USA
    [66 rows x 4 columns]
    

    【讨论】:

      【解决方案3】:

      你可以把你的数据框放在一个列表中,然后做任何你想做的事情:

      # x5 row duplicate
      
      df = df.append([df]*5, ignore_index=True)
      df.sort_values(by='Name').head(15)
      
      
      # Result
      
      Name    Age     City    Country
      28  John    16  New York    US
      4   John    16  New York    US
      22  John    16  New York    US
      34  John    16  New York    US
      16  John    16  New York    US
      10  John    16  New York    US
      17  Mike    17  las vegas   US
      29  Mike    17  las vegas   US
      23  Mike    17  las vegas   US
      11  Mike    17  las vegas   US
      35  Mike    17  las vegas   US
      5   Mike    17  las vegas   US
      3   Neelu   32  Bangalore   India
      33  Neelu   32  Bangalore   India
      15  Neelu   32  Bangalore   India
      

      【讨论】:

        猜你喜欢
        • 2022-12-09
        • 1970-01-01
        • 2022-01-21
        • 2021-07-23
        • 2019-04-12
        相关资源
        最近更新 更多