如何在熊猫中添加行直到满足条件

时间:2021-04-07 14:11:44

标签: python pandas numpy

我有一个这样的数据框:

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

3 个答案:

答案 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)

代码中的问题:

  1. 使用 pd.DataFrame(row),您可以在数据框中创建一个系列而不是一行。
  2. 使用 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