我有一个这样的数据框:
x y frames
0 10 7
1 14 8
1 19 9
3 11 10
我想将行添加到数据帧的顶部,以便 frames
可以从 0 开始并递增 1,直到达到第一个原始 frames
值。我想为所有其他列添加 NaN 值。
我试过这个,但它需要很长时间并最终崩溃:
starting_frame = int(df.frames.values[0])
print(starting_frame)
count = 0
while count < starting_frame:
row = ['', np.nan, np.nan, np.nan,
np.nan, np.nan, np.nan,
'', np.nan, np.nan, np.nan,
count]
d = pd.DataFrame(row)
df = pd.concat([d, df])
count+=1
print(df)
它应该是这样的:
x y frames
NaN NaN 0
NaN NaN 1
NaN NaN 2
NaN NaN 3
NaN NaN 4
NaN NaN 5
NaN NaN 6
0 10 7
1 14 8
1 19 9
3 11 10
答案 0 :(得分:2)
试试 reindex
out = df.set_index('frames').reindex(range(df['frames'].max()+1)).reset_index()
out
Out[545]:
frames x y
0 0 NaN NaN
1 1 NaN NaN
2 2 NaN NaN
3 3 NaN NaN
4 4 NaN NaN
5 5 NaN NaN
6 6 NaN NaN
7 7 0.0 10.0
8 8 1.0 14.0
9 9 1.0 19.0
10 10 3.0 11.0
答案 1 :(得分:0)
您可以为帧的缺失值创建一个系列,并使用 concat 将其预先添加到您的 DataFrame
In [66]: pd.concat([pd.Series(range(0, df.loc[0, 'frames']), name='frames').to_frame(), df]).reset_index(drop=True)
Out[66]:
frames x y
0 0 NaN NaN
1 1 NaN NaN
2 2 NaN NaN
3 3 NaN NaN
4 4 NaN NaN
5 5 NaN NaN
6 6 NaN NaN
7 7 0.0 10.0
8 8 1.0 14.0
9 9 1.0 19.0
10 10 3.0 11.0
答案 2 :(得分:0)
代码中的问题:
pd.DataFrame(row)
,您可以在数据框中创建一个系列而不是一行。pd.concat([d, df])
和 count += 1
,较大的框架将位于顶部。要解决这些问题,您可以使用
starting_frame = int(df.frames.values[0])
count = starting_frame - 1
while count >= 0:
row = [np.nan, np.nan, count]
d = pd.DataFrame([row], columns=['x', 'y', 'frames'])
df = pd.concat([d, df])
count -= 1
print(df)
您还可以创建一个辅助数据框,其 frames
列值从 0 开始,并在该辅助数据框上合并 df
。
df = df.merge(pd.DataFrame({'frames': range(df['frames'].max() + 1)}), how='right')
# print(df)
x y frames
0 NaN NaN 0
1 NaN NaN 1
2 NaN NaN 2
3 NaN NaN 3
4 NaN NaN 4
5 NaN NaN 5
6 NaN NaN 6
7 0.0 10.0 7
8 1.0 14.0 8
9 1.0 19.0 9
10 3.0 11.0 10