我有一个缺少一些行的数据框。我想选择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)
谢谢!
答案 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