2017-09-11 18 views
0

データフレーム内のvar Aの5番目と6番目の行ごとに平均をとって、その結果をvar Bという新しい列に入れようとしていますが、NaNが表示されます。値を正しく返さなかったために結果が出る可能性がありますか?ここでデータフレームに結果が返されない

はサンプルデータです:

PID A  
1  0 
1  3 
1  2 
1  6 
1  0 
1  2 
2  3 
2  3 
2  1 
2  4 
2  0 
2  4 

期待される結果:

PID A  B 
1  0  1 
1  3  1 
1  2  1 
1  6  1 
1  0  1 
1  2  1 
2  3  2 
2  3  2 
2  1  2 
2  4  2 
2  0  2 
2  4  2 

マイコード:

lst1 = df.iloc[5::6, :] 
lst2 = df.iloc[4::6, :] 

df['B'] = (lst1['A'] + lst2['A'])/2 
print(df['B']) 

は、スクリプトはエラーなしで実行することができますが、VAR Bがあります空で、NaNと表示されます。 ご協力いただきありがとうございます!

答えて

1

異なるインデックスがあるので、問題のデータが整列していないので、NaNを取得してください。

print(lst1) 
    PID A 
5  1 2 
11 2 4 

print(lst2) 
    PID A 
4  1 0 
10 2 0 

print (lst1['A'] + lst2['A']) 
4 NaN 
5 NaN 
10 NaN 
11 NaN 
Name: A, dtype: float64 

ソリューションのための追加の使用valuesあるSeriesnumpy arrayへ:

print (lst1['A'] + (lst2['A'].values)) 
5  2 
11 4 
Name: A, dtype: int64 

それとも、2つのnumpyのアレイ合計することができます:あなたが必要と思わ

print (lst1['A'].values + (lst2['A'].values)) 
[2 4] 

を:

df['B'] = (lst1['A'] + lst2['A'].values).div(2) 
df['B'] = df['B'].bfill() 
print(df) 
    PID A B 
0  1 0 1.0 
1  1 3 1.0 
2  1 2 1.0 
3  1 6 1.0 
4  1 0 1.0 
5  1 2 1.0 
6  2 3 2.0 
7  2 3 2.0 
8  2 1 2.0 
9  2 4 2.0 
10 2 0 2.0 
11 2 4 2.0 

しかし5.meantransformPID使用groupbyでグループごとに6.値が必要な場合:

df['B'] = df.groupby('PID').transform(lambda x: x.iloc[[4, 5]].mean()) 
print(df) 
    PID A B 
0  1 0 1.0 
1  1 3 1.0 
2  1 2 1.0 
3  1 6 1.0 
4  1 0 1.0 
5  1 2 1.0 
6  2 3 2.0 
7  2 3 2.0 
8  2 1 2.0 
9  2 4 2.0 
10 2 0 2.0 
11 2 4 2.0 
+0

Thx!インデックスに問題がある場合は、 'reset_index(drop = True)'を使用してインデックスを削除してから平均を取ろうとしますが、 'NaN'は依然として問題です。なぜなのかご存知ですか?ありがとう! – Kay

+0

dfとdfの両方で異なるインデックスとパンダが同じものを必要とする問題があります。したがって 'lst1 = lst1.reset_index(drop = True)'と 'lst1 = lst1.reset_index(drop = True)'が必要です。 – jezrael

1

オプション1'PID'によって定義された各グループ内の5番目と6番目の位置の平均値を取って
簡単な方法。仮定joinを用い

df.assign(B=df.groupby('PID').transform(lambda x: x.values[[4, 5]].mean())) 

    PID A B 
0  1 0 1.0 
1  1 3 1.0 
2  1 2 1.0 
3  1 6 1.0 
4  1 0 1.0 
5  1 2 1.0 
6  2 3 2.0 
7  2 3 2.0 
8  2 1 2.0 
9  2 4 2.0 
10 2 0 2.0 
11 2 4 2.0 

オプション2
楽しい方法は、実際には各'PID'ための正確6行があります。

df.join(df.set_index('PID').A.pipe(lambda d: (d.iloc[4::6] + d.iloc[5::6])/2).rename('B'), on='PID') 

    PID A B 
0  1 0 1.0 
1  1 3 1.0 
2  1 2 1.0 
3  1 6 1.0 
4  1 0 1.0 
5  1 2 1.0 
6  2 3 2.0 
7  2 3 2.0 
8  2 1 2.0 
9  2 4 2.0 
10 2 0 2.0 
11 2 4 2.0 
関連する問題