2017-08-11 31 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