2017-08-13 11 views
0

私は列間に水平に補間する必要がある値のないデータフレームを持っています。補間のために、いくつかの列の名前(名前は数値です)が補間のためのインデックス値として使用されます。私はより良い問題を伝えるために一緒に、次の例に入れている:Pythonで線形補間を行いますが、列タイトルをインデックス値として使用します

初期データフレーム:

import pandas as pd 
testdata1 = [('Prod', ['P1', 'P2']), 
('A', ['1', '1']), 
('1', ['10', '40']), 
('2', ['', '']), 
('3', ['30', '80']), 
('B', ['1', '2']),    
] 
df = pd.DataFrame.from_items(testdata1) 
df 

Initial df

対象データフレーム:私の例では

targetdf = [('Prod', ['P1', 'P2']), 
('A', ['1', '1']), 
('1', ['10', '40']), 
('2', ['20', '60']), 
('3', ['30', '80']), 
('B', ['1', '2']),    
] 
df2 = pd.DataFrame.from_items(targetdf) 
df2 

Target df

上記のように、perf orm補間(水平)は列 '1'、 '2'、 '3'です。これらの列タイトル(1,2,3)は、補間計算で使用されるインデックス値です。

私は、インデックス値がある特定の列のすべてのセルである場合にのみ、Pythonで.interpolate()を使用する方法を知っています。どんな助けでも大歓迎です。

答えて

1

あなたは、行によって、プロセスのためのパラメータaxis=1applyを使用することができます。

#replace whitespaces to NaNs 
df = df.replace('', np.nan) 
#rename columns from strings to number 
d = {'1':1,'2':2,'3':3} 
df = df.rename(columns=d) 
#columns for interploate (necessary numeric) 
cols = [1,2,3] 

#convert values in cols to floats first, interpolate and if int output convert to int last 
df[cols] = df[cols].astype(float) 
        .apply(lambda x: x.interpolate(method='index'), axis=1) 
        .astype(int) 
print (df) 
    Prod A 1 2 3 B 
0 P1 1 10 20 30 1 
1 P2 1 40 60 80 2 
+1

感謝を適用します。これは素晴らしい作品です! – Jdoe

+0

私は質問があります。補間に使用するインデックス値はどこで指定しましたか?私はあなたがインデックスメソッドを使用したことを知っていますが、インデックスに使用する値を指定した場所はわかりません。 – Jdoe

+0

これはカラム名 '1,2,3'を使用します。最も良いのは 'df [cols] .astype(float).apply(f、axis = 1)'と 'def f(x):print(x)print(補間(メソッド= 'インデックス')' – jezrael

0

あなたは、列名が数値であることを言及し、彼らはあなたが提供されるサンプルデータ内の文字列として表示されます。彼らは実際には数値型であれば、interpolate()だけで動作するはずです:

import numpy as np 
import pandas as pd 

testdata1 = [('Prod', ['P1', 'P2']), 
      ('A', [1., 1.]), 
      (1, [10., 40.]), 
      (2, [np.nan, np.nan]), 
      (3, [30., 80.]), 
      ('B', [1., 2.]),    
      ] 
df = pd.DataFrame.from_items(testdata1) 

cols = [1,2,3] 
df[cols] = df[cols].interpolate(method="index", axis=1) 

出力:

Prod A  1  2  3 B 
0 P1 1.0 10.0 20.0 30.0 1.0 
1 P2 1.0 40.0 60.0 80.0 2.0 
+0

こんにちはAndrew。列名を' 2 'に変更したときに動作しません。 – Jdoe

+0

こんにちはJdoe私は最後に確認しました.2から2.2への列の変更は正しく行われていますが、 'cols'を' 1,2.2,3 'に更新したことを確認できますか?カラム名が実際には2.2で、文字列表現ではないことを確認してください。つまり、 "2.2"? –

+0

こんにちはAndrew。何らかの理由で、私のために働いていません。 NaNs。 – Jdoe

0

数値に変換し、interpolate

In [104]: cols = ['1','2','3'] 

In [105]: df[cols].apply(pd.to_numeric).interpolate(axis=1) 
Out[105]: 
     1  2  3 
0 10.0 20.0 30.0 
1 40.0 60.0 80.0 
+0

こんにちはJohn。列名 '2'を '2.2'に変更したときに動作させることができません。 – Jdoe

関連する問題