在pandas,多列名称中排序数据帧的问题

时间:2017-07-21 17:21:38

标签: python pandas dataframe

我是初学者,使用python和pandas。我正在尝试保存我通过函数生成的一些结果。我现在有几个问题要生成具有所需结果的数据帧。这是我写的一个可迭代函数的例子(为了简化描述,我使用了几个三角形区域的例子。我的实际函数更复杂,有几个中间步骤):

Base = 5
H = [1, 2, 3, 4, 5]

for i in H:

    def Triangle_area():

        H = [i]
        ratio = (Base*H)
        area = np.divide(ratio,2)

        ms = pd.DataFrame(area, columns=[i])
        A = ms[i].mean()
        A1 = pd.DataFrame({'area':A}, index=[i])

        return A1


    areas = Triangle_area()
    print(areas)

结果是数据帧或一系列数据帧,如下所示:

   area
1   0.5
   area
2   1.0
   area 
3   1.5
   area
4   2.0
   area
5   2.5

但我想要的应该是这样的:

H   area
1   0.5
2   1.0
3   1.5
4   2.0
5   2.5

我认为必须有几种方法可以做到这一点,但我找不到办法。提前感谢您的意见。

3 个答案:

答案 0 :(得分:0)

您每次在示例中创建并返回一个新数据帧,这不是您想要的。以下是三角形程序的示例,它将返回一个包含结果的数据框。我希望这会有所帮助,您可以找到如何将其应用到您的问题中,如果您需要更多帮助,请告诉我

import pandas as pd
import numpy as np


def Triangle_area(height, base):
    '''
    Calculate the area of a right angle triangle, Area(height, base) = (base*height)/2
    Put all results in pandas dataframe before returning
    '''
    H = np.array(height)    # Make numpy array of heights, easier for our computations
    ratio = H * base        
    area = ratio/2
    A1 = pd.DataFrame({'H': height, 'area':area}) # Turn results into pandas dataframe

    return A1 # return column


Base = 5
H = [1, 2, 3, 4, 5]

areas = Triangle_area(H, Base)
print(areas)

答案 1 :(得分:0)

首先尝试使用矢量化方法:

In [115]: def Triangle_area(base, h):
     ...:     return base * h / 2.
     ...:

In [116]: df = pd.DataFrame({'base':[1,2,3,4,5], 'h':[5]*5})

In [117]: df
Out[117]:
   base  h
0     1  5
1     2  5
2     3  5
3     4  5
4     5  5

In [118]: df['area'] = Triangle_area(df['base'], df['h'])

In [119]: df
Out[119]:
   base  h  area
0     1  5   2.5
1     2  5   5.0
2     3  5   7.5
3     4  5  10.0
4     5  5  12.5

答案 2 :(得分:0)

def Triangle_area():

    '''
    @param Base, scalar length of triangle base
    @param H, array of various triangle heights
    @returns A1, dataframe with columns 'H' and 'area'
        corresponding to height and area of triangle with 
        that height
    '''

    ratio = Base*np.array(H)
    area = np.divide(ratio,2)

    A1 = pd.DataFrame({'H':np.array(H),'area':area})

    return A1

areas = Triangle_area()
print(areas)

这里我尝试保留与您相同的函数和全局变量名称。一些技巧:

  • 将列表H转换为NumPy数组(NumPy与pandas的效果非常好,如果您不熟悉它,我建议您查看它。)

  • 不使用for loop,而是直接对数组进行操作。