通过在具有非数字值的两行上应用插值函数,从旧的框架创建新的数据框架

时间:2018-08-08 17:17:42

标签: pandas dataframe interpolation apply

我有一个缺少一些行的数据框。我想选择2行(选择单独完成)并在这两行之间插入值。如果我在这两行中生成了x行,我想将两个末端行的值重复到中点。列是非数字值,我本质上是复制行之一的列的值。 例如,如果我有以下行: 我的旧值数据框是:

df_old : 
   fname    lname     occupation
0   Alex    Schapiro    teacher
1   paul    Gorman       nurse

我编写了一个函数,该函数接受称为data_col的一列(具有2个值)和一个新点的列表,以为其生成值(称为new_x)。它在列表(new_x)中找到中点,并重复该列的第一个值直到中点,并从中点到列表长度的结尾重复该列的第二个值。结果将是生成的值的列表。

def generate_object_dtype(data_col,new_x):
    new_val = []
    mid_tp = middle(new_x)
    new_val.extend([data_col.iloc[0]]*sum(i <= mid_tp for i in new_x))
    new_val.extend([data_col.iloc[1]]*sum(i > mid_tp for i in new_x))

    return(new_val)



function to find mid point of the list :
def middle(a):
    a = sorted(a)
    l = len(a)

    if len(a) % 2 == 0.:
        m = (a[int(l / 2)] + a[int(l / 2) - 1]) / 2.
    else:
        if l < 2:
            m = a[0]
        else:
            m = a[int(l / 2)]

    return m

现在,我在old_df上应用generate函数来创建一个新的df,其中包含用于非数字列值的内插行:

    >>old_data.apply(lambda col: generate_object_dtype(col, new_x), axis=0) 

fname                     [Alex, Alex, paul, paul]
lname         [Schapiro, Schapiro, Gorman, Gorman]
occupation        [teacher, teacher, nurse, nurse]
dtype: object

结果是一系列列表。我需要结果是这样的数据框: new_df:

   fname    lname     occupation
0   Alex    Schapiro    teacher
1   Alex    Schapiro    teacher
2   paul    Gorman       nurse
3   paul    Gorman       nurse

我该怎么做? ps。通常,将函数应用于数据框是正确的,其中结果是具有全新值的新数据框: 即

new_df = old_df.apply(lambda col: generate_object_dtype(col, new_x), axis=0) 

谢谢!

1 个答案:

答案 0 :(得分:0)

让我们接受您的声明,您可以只提供state

access_type

输出:

number of rows

如果行数为奇数,这将使后一行再重复1次。使用import numpy as np nrows = 4 new_x = np.arange(0, nrows, 1) # Make sure the index begins at 0, in case you slice from another part of the `df` df = df.reset_index(drop=True) # Move the second value to the midpoint df.index = df.index*nrows//2 # Fill the missing values forward df = df.reindex(new_x).ffill()

  fname     lname occupation
0  Alex  Schapiro    teacher
1  Alex  Schapiro    teacher
2  paul    Gorman      nurse
3  paul    Gorman      nurse

您可以通过将索引修改为,将其更改为在第一个值上额外重复一次:

nrows=5

然后将输出:

  fname     lname occupation
0  Alex  Schapiro    teacher
1  Alex  Schapiro    teacher
2  paul    Gorman      nurse
3  paul    Gorman      nurse
4  paul    Gorman      nurse