2017-08-11 91 views
1

我正在尝试在Python中执行线性插值,以便在特定列中的特定值计算插值值。在Python数据框中插值

在我下面的示例中,我想使用插值中高度列中相关单元格的实际数值插值产品“a”和“b”的测量值。我可以将高度列称为插值索引吗?

当我对产品“a”的缺失测量进行插值时,用于插值的索引值为4,5和7.对于产品“b”的插值,要使用的索引值为1,2.2和3。

我知道dataframe.interpolate(),但我努力修改我的代码以使用正确的索引值。

这里是我开始与数据框代码:

import pandas as pd 
testdata1 = [('Product', ['a', 'a', 'a', 'b', 'b', 'b','b']), 
    ('Height', ['4', '5', '7', '1', '2.2', '3','4']), 
    ('Measurement', ['35.00', '', '55.00','10.00','','30.00','40.00']), 
    ] 
df = pd.DataFrame.from_items(testdata1) 
df 

testdata1

而且这里是数据框我需要的代码:

targetdf = [('Product', ['a', 'a', 'a', 'b', 'b', 'b','b']), 
    ('Height', ['4', '5', '7', '1', '2.2', '3','4']), 
    ('Measurement', ['35.00', '41.67', '55.00','10.00','22.00','30.00','40.00']), 
    ] 
df2 = pd.DataFrame.from_items(targetdf) 
df2 

enter image description here

如果这不能用数据框完成,我是o用其他想法写在Python中。

任何帮助,非常感谢。我是Python的新手。谢谢。

回答

1

你可以先一些数据清洗使用:

#convert '' to `NaN`s and all strings to numeric 
df['Measurement'] = pd.to_numeric(df['Measurement'], errors='coerce') 
#convert strings to numeric 
df['Height'] = df['Height'].astype(float) 

然后set_indexgroupbyinterpolateapply自定义函数,最后reset_indexreindex得到列的原始顺序:

df1 = df.set_index('Height') \ 
     .groupby('Product') \ 
     .apply(lambda x: x.interpolate(method='index')) \ 
     .reset_index() \ 
     .reindex(columns=df.columns) 
print (df1) 
    Product Height Measurement 
0  a  4.0 35.000000 
1  a  5.0 41.666667 
2  a  7.0 55.000000 
3  b  1.0 10.000000 
4  b  2.2 22.000000 
5  b  3.0 30.000000 
6  b  4.0 40.000000 
+0

谢谢。这完美的作品! – Jdoe

+0

不客气!愉快的周末! – jezrael

+0

请你能解释重置索引,并重新编译你的代码的一部分?这并不是100%清楚。谢谢 – Jdoe