Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在熊猫中添加行,直到满足条件_Python_Pandas_Numpy - Fatal编程技术网

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

Python 如何在熊猫中添加行,直到满足条件,python,pandas,numpy,Python,Pandas,Numpy,我有这样一个数据帧: x y frames 0 10 7 1 14 8 1 19 9 3 11 10 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

我有这样一个数据帧:

x     y    frames
0    10     7 
1    14     8    
1    19     9
3    11     10

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

我想在数据帧的顶部添加行,这样
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)

尝试使用
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

尝试使用
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

您可以为缺少的帧值创建一个系列,并使用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

您可以为缺少的帧值创建一个系列,并使用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
代码中的问题:

  • 使用
    pd.DataFrame(row)
    ,您正在创建一个系列,而不是DataFrame中的一行
  • 使用
    pd.concat([d,df])
    count+=1
    ,较大的帧将位于顶部
  • 要修复这些问题,您可以使用

    start_frame=int(df.frames.values[0])
    计数=开始帧-1
    当计数>=0时:
    行=[np.nan,np.nan,count]
    d=pd.DataFrame([row],columns=['x','y','frames']))
    df=pd.concat([d,df])
    计数-=1
    打印(df)
    
    您还可以创建一个辅助数据框,其
    frames
    列值从0开始,并在该辅助数据框上合并
    df

    df=df.merge(pd.DataFrame({'frames':range(df['frames'].max()+1)}),how='right')
    
    #打印(df)
    x-y框架
    0楠楠0
    1楠楠1
    2楠楠2
    3楠楠3
    4楠楠4
    5楠楠5
    6楠楠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
    
    代码中的问题:

  • 使用
    pd.DataFrame(row)
    ,您正在创建一个系列,而不是DataFrame中的一行
  • 使用
    pd.concat([d,df])
    count+=1
    ,较大的帧将位于顶部
  • 要修复这些问题,您可以使用

    start_frame=int(df.frames.values[0])
    计数=开始帧-1
    当计数>=0时:
    行=[np.nan,np.nan,count]
    d=pd.DataFrame([row],columns=['x','y','frames']))
    df=pd.concat([d,df])
    计数-=1
    打印(df)
    
    您还可以创建一个辅助数据框,其
    frames
    列值从0开始,并在该辅助数据框上合并
    df

    df=df.merge(pd.DataFrame({'frames':range(df['frames'].max()+1)}),how='right')
    
    #打印(df)
    x-y框架
    0楠楠0
    1楠楠1
    2楠楠2
    3楠楠3
    4楠楠4
    5楠楠5
    6楠楠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
    
    这可以在
    帧中获得正确的值,但它会将Nant中的所有
    x
    y
    值用于在
    帧中获得正确的值,但它会将Nant中的所有
    x
    y
    值用于在帧中获得正确的值,但它会将所有的x和y值NaN@connor449检查您的列类型,它在我这边工作得很好这可以在帧中获得正确的值,但是它可以在NaN@connor449检查你的列类型,它在我这边可以正常工作