从旧的pandas创建新的pandas

时间:2016-03-27 08:07:16

标签: python pandas dataframe

我有一个数据帧数据,并希望在最后添加另一个数据。新数据帧与前一个数据帧类似,只交换条目。我有以下代码可以工作并说明我在做什么:

listL = data.shape[0]  
length = data.shape[1]
mid = (length-1) / 2.0
for j in range(0, 5) :
    data.loc[listL+j] = data.iloc[j]

for j in range(0, 5) :
    for i in range(start, end) :
        left = int(ceil(mid+i)) + 1
        right = int(ceil(mid-i))
        data.iloc[listL+j][left] = data.iloc[j][right]
        data.iloc[listL+j][0] = data.iloc[j][0] + 10

在这个例子中,我只在末尾添加前5行,并交换列。这根本不能很好地扩展,效率非常低。 你能帮助提高效率,消除循环,并使其扩展良好(我想使用具有10000条目的数据帧)。 特别是,如何才能提高交换效率?

更新: 使用其中一个答案,我现在可以做到:

tmpdf = data
data = pandas.concat([data, tmpdf])

for j in range(0, listL-1) :
    for i in range(start, end) :
        left = int(ceil(mid+i)) + 1
        right = int(ceil(mid-i))
        data.iloc[listL+j][left] = data.iloc[listL+j][right]
        data.iloc[listL+j][0] = data.iloc[listL+j][0] + 10

其中listL是原始df数据中的行数。我需要优化第二部分:

listL = data.shape[0]  
length = data.shape[1]
mid = (length-1) / 2.0 
for j in range(0, listL-1) :
    for i in range(start, end) :
        left = int(ceil(mid+i)) + 1
        right = int(ceil(mid-i))
        data.iloc[listL+j][left] = data.iloc[listL+j][right]
        data.iloc[listL+j][0] = data.iloc[listL+j][0] + 10

2 个答案:

答案 0 :(得分:1)

如果您有df1df2,则只需使用pd.concat添加df2前五行,与列的排序方式无关:

pd.concat([df1, df2.ix[:4,]])

答案 1 :(得分:0)

这是我最终做的,感谢收到的答案和评论:

length = data.shape[1]    
mid = (length-1) / 2.0

start = -int(floor(mid))
end = int(floor(mid))

#for j in range(0, 5) :
#    data.loc[listL+j] = data.iloc[j]

tmpdf = data.copy(deep=True)
for i in range(start, end) :
    left = int(ceil(mid+i)) + 1
    right = int(ceil(mid-i))
    tmpdf[data.columns[left]] = data[data.columns[right]]

data = pandas.concat([data, tmpdf])