如何通过重复最后一行来扩展pandas DataFrame?

5
我是一名有用的助手,可以为您进行文本翻译。
我有一个DataFrame,并希望通过重复最后一行n次来扩展它。
示例代码:
import pandas as pd
import numpy as np
dates = date_range('1/1/2014', periods=4)
df = pd.DataFrame(np.eye(4, 4), index=dates, columns=['A', 'B', 'C', 'D'])
n = 3
for i in range(n):
    df = df.append(df[-1:])

所以 df 是

            A  B  C  D
2013-01-01  1  0  0  0
2013-01-02  0  1  0  0
2013-01-03  0  0  1  0
2013-01-04  0  0  0  1
2013-01-04  0  0  0  1
2013-01-04  0  0  0  1
2013-01-04  0  0  0  1

有没有更好的方法在不使用for循环的情况下完成这个任务?

3个回答

10
这里有一种替代方法(高级索引)可以实现这个功能:
df.append( df.iloc[[-1]*3] )

Out[757]: 
            A  B  C  D
2014-01-01  1  0  0  0
2014-01-02  0  1  0  0
2014-01-03  0  0  1  0
2014-01-04  0  0  0  1
2014-01-04  0  0  0  1
2014-01-04  0  0  0  1
2014-01-04  0  0  0  1

3
您可以使用嵌套的concat操作,内部操作将会把您的最后一行重复3次,然后我们再将其与原始数据框连接起来:
In [181]:

dates = pd.date_range('1/1/2014', periods=4)
df = pd.DataFrame(np.eye(4, 4), index=dates, columns=['A', 'B', 'C', 'D'])
pd.concat([df,pd.concat([df[-1:]]*3)])
Out[181]:
            A  B  C  D
2014-01-01  1  0  0  0
2014-01-02  0  1  0  0
2014-01-03  0  0  1  0
2014-01-04  0  0  0  1
2014-01-04  0  0  0  1
2014-01-04  0  0  0  1
2014-01-04  0  0  0  1

这段代码可以放进一个函数里面,如下所示:
In [182]:

def repeatRows(d, n=3):
    return pd.concat([d]*n)

pd.concat([df,repeatRows(df[-1:], 3)])
Out[182]:
            A  B  C  D
2014-01-01  1  0  0  0
2014-01-02  0  1  0  0
2014-01-03  0  0  1  0
2014-01-04  0  0  0  1
2014-01-04  0  0  0  1
2014-01-04  0  0  0  1
2014-01-04  0  0  0  1

2

另一种方法,不使用任何索引或多个连接符,是使用tail()解包运算符。请注意,方法append已经弃用

pd.concat([df, *[df.tail(1)]*3]) 

因此,要重复最后的nd次:

pd.concat([df, *[df.tail(n)]*d]) 

tail(n)会返回最后n个元素(默认情况下n=5)。

解包运算符('*')允许您将序列或可迭代对象解包为单独的变量,例如:

def sum_var(a, b, c):
    return a + b + c

numbers = [1, 2, 3]

sum_result = sum_var(*numbers)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接