【问题标题】:Extract first and last row of a dataframe in pandas在熊猫中提取数据框的第一行和最后一行
【发布时间】:2016-04-11 07:16:27
【问题描述】:

如何将给定数据帧的第一行和最后一行提取为 pandas 中的新数据帧?

我尝试使用iloc 选择所需的行,然后使用concat,如下所示:

df=pd.DataFrame({'a':range(1,5), 'b':['a','b','c','d']})
pd.concat([df.iloc[0,:], df.iloc[-1,:]])

但这不会产生熊猫数据框:

a    1
b    a
a    4
b    d
dtype: object

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我认为最简单的方法是.iloc[[0, -1]]

    df = pd.DataFrame({'a':range(1,5), 'b':['a','b','c','d']})
    df2 = df.iloc[[0, -1]]
        
    print(df2)
    
       a  b
    0  1  a
    3  4  d
    

    【讨论】:

    • 请注意,如果框架仅包含单行,则会复制第一行
    • 请注意,df 在使用最后一个元素索引 (-1) 时需要 iloc,这使得它不同于列表和非最后一个索引
    【解决方案2】:

    你也可以使用headtail

    In [29]: pd.concat([df.head(1), df.tail(1)])
    Out[29]:
       a  b
    0  1  a
    3  4  d
    

    【讨论】:

    • 我认为这是最好的解决方案,因为它适用于所有事情。尝试在帧的切片上使用.iloc 时出现“索引位置越界”错误(这在索引更改时有意义)不想reset_index,因为当前索引很重要
    【解决方案3】:

    如果框架仅包含一行,则接受的答案重复第一行。如果这是一个问题

    df[0::len(df)-1 if len(df) > 1 else 1]

    甚至适用于单行数据帧。

    示例:对于以下数据框,这不会创建重复:

    df = pd.DataFrame({'a': [1], 'b':['a']})
    df2 = df[0::len(df)-1 if len(df) > 1  else 1]
    
    print df2
    
       a  b
    0  1  a
    

    而这样做:

    df3 = df.iloc[[0, -1]]
    
    print df3 
    
       a  b
    0  1  a
    0  1  a
    

    因为单行同时是第一行和最后一行。

    【讨论】:

    • 好点。您能否提供一个示例输出以做出更完整的答案
    【解决方案4】:

    我认为您可以尝试将参数axis=1 添加到concat,因为df.iloc[0,:]df.iloc[-1,:] 的输出是Series 并由T 转置:

    print df.iloc[0,:]
    a    1
    b    a
    Name: 0, dtype: object
    
    print df.iloc[-1,:]
    a    4
    b    d
    Name: 3, dtype: object
    
    print pd.concat([df.iloc[0,:], df.iloc[-1,:]], axis=1)
       0  3
    a  1  4
    b  a  d
    
    print pd.concat([df.iloc[0,:], df.iloc[-1,:]], axis=1).T
       a  b
    0  1  a
    3  4  d
    

    【讨论】:

      【解决方案5】:

      这是与大型数据集相同的样​​式:

      x = df[:5]
      y = pd.DataFrame([['...']*df.shape[1]], columns=df.columns, index=['...'])
      z = df[-5:]
      frame = [x, y, z]
      result = pd.concat(frame)
      
      print(result)
      

      输出:

                           date  temp
      0     1981-01-01 00:00:00  20.7
      1     1981-01-02 00:00:00  17.9
      2     1981-01-03 00:00:00  18.8
      3     1981-01-04 00:00:00  14.6
      4     1981-01-05 00:00:00  15.8
      ...                   ...   ...
      3645  1990-12-27 00:00:00    14
      3646  1990-12-28 00:00:00  13.6
      3647  1990-12-29 00:00:00  13.5
      3648  1990-12-30 00:00:00  15.7
      3649  1990-12-31 00:00:00    13
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-09
        • 2023-04-02
        • 1970-01-01
        • 2013-12-02
        相关资源
        最近更新 更多