重复数据框中的元素

时间:2017-07-24 15:06:50

标签: python-3.x pandas

大家好我有以下数据框:

A | B | C
1   2   3 
2   3   4 
3   4   5
4   5   6

我试图只重复数据的最后两行,使它看起来像这样:

A | B | C
1   2   3 
2   3   4 
3   4   5
3   4   5
4   5   6
4   5   6

我尝试过使用append,concat和repeat无济于事。

repeated = lambda x:x.repeat(2)
df.append(df[-2:].apply(repeated),ignore_index=True)

这将返回以下不正确的数据框:

A | B | C
1   2   3 
2   3   4 
3   4   5
4   5   6
3   4   5
3   4   5
4   5   6
4   5   6

3 个答案:

答案 0 :(得分:2)

使用pd.concat和索引切片与.iloc

pd.concat([df,df.iloc[-2:]]).sort_values(by='A')

输出:

   A  B  C
0  1  2  3
1  2  3  4
2  3  4  5
2  3  4  5
3  4  5  6
3  4  5  6

答案 1 :(得分:2)

您可以使用numpy.repeat重复索引,然后按loc创建df1,最后添加到原始版本,但在按iloc过滤掉最后2行之前:

df1 = df.loc[np.repeat(df.index[-2:].values, 2)]
print (df1)
   A  B  C
2  3  4  5
2  3  4  5
3  4  5  6
3  4  5  6

print (df.iloc[:-2])
   A  B  C
0  1  2  3
1  2  3  4

df = df.iloc[:-2].append(df1,ignore_index=True)
print (df)
   A  B  C
0  1  2  3
1  2  3  4
2  3  4  5
3  3  4  5
4  4  5  6
5  4  5  6

如果要使用您的代码,请添加iloc仅过滤最后2行:

repeated = lambda x:x.repeat(2)
df = df.iloc[:-2].append(df.iloc[-2:].apply(repeated),ignore_index=True)
print (df)
   A  B  C
0  1  2  3
1  2  3  4
2  3  4  5
3  3  4  5
4  4  5  6
5  4  5  6

答案 2 :(得分:2)

我偏向于将索引操作到我们的目标模式,然后要求数据框采用新的形式。

选项1
使用pd.DataFrame.reindex

df.reindex(df.index[:-2].append(df.index[-2:].repeat(2)))

   A  B  C
0  1  2  3
1  2  3  4
2  3  4  5
2  3  4  5
3  4  5  6
3  4  5  6

多行同样的事情

i = df.index
idx = i[:-2].append(i[-2:].repeat(2))
df.reindex(idx)

还可以使用loc

i = df.index
idx = i[:-2].append(i[-2:].repeat(2))
df.loc[idx]

选项2
values重建。只有这样才能使dtypes全部相同。

i = np.arange(len(df))
idx = np.append(i[:-2], i[-2:].repeat(2))
pd.DataFrame(df.values[idx], df.index[idx])

   0  1  2
0  1  2  3
1  2  3  4
2  3  4  5
2  3  4  5
3  4  5  6
3  4  5  6

选项3
也可以在np.array

中使用iloc
i = np.arange(len(df))
idx = np.append(i[:-2], i[-2:].repeat(2))
df.iloc[idx]

   A  B  C
0  1  2  3
1  2  3  4
2  3  4  5
2  3  4  5
3  4  5  6
3  4  5  6