大家好我有以下数据框:
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
答案 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