ฉันจะคำนวณค่าเฉลี่ยโดยปล่อย NaN และค่าผิดปกติจาก dataframe ในรูปแบบนี้ได้อย่างไร

ฉันมี dataframe ในรูปแบบด้านล่าง:

Original Dataframe

    |  x  |  value1  |  value2  |  value3  |  value4
 ---|-----|----------|----------|----------|-----------
  0 |  1  |    1     |   NaN    |    3     |   1
  1 |  2  |    4     |   NaN    |    1     |   NaN
  2 |  3  |    2     |    6     |    1     |   2
  3 |  4  |    1     |    1     |    2     |   1

เป้าหมายของฉันคือการหาค่าเฉลี่ยสำหรับแต่ละบรรทัด โดยปล่อย NaN ออกและกำจัดค่าผิดปกติด้วย เป้าหมายคือการเข้าถึง dataframe ใหม่ด้วยรูปแบบต่อไปนี้:

Desired Dataframe

    |  x  |  mean (after dropping the NaN and the outliers)*
 ---|-----|--------
  0 |  1  |   a
  1 |  2  |   b   
  2 |  3  |   c   
  3 |  4  |   d   

*โปรดทราบว่า a, b, c, d คือค่าเฉลี่ย (ฉันไม่ได้คำนวณผลลัพธ์)


เป้าหมายสูงสุดหลังจากบรรลุผลคือการพิมพ์กราฟสำหรับค่าต่างๆ เมื่อเวลาผ่านไป


เมื่อทำงานกับรายการค่าเดียว เช่น เทียบเท่ากับคอลัมน์ของค่าหนึ่งคอลัมน์และดัชนีหนึ่งคอลัมน์ ฉันสามารถดำเนินการทั้งหมดได้: ปล่อย NaN คำนวณคะแนน Z แล้วส่งคืนรายการค่าดังที่แสดง ด้านล่าง:

import pandas as pd   
import numpy as np
from scipy import stats

data = {'value': [1, 2, 15, np.NaN, 2, 2, 2, 3, 1, 1], 
        'x': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}
df = pd.DataFrame(data)

df.dropna(inplace=True)
df = df[(np.abs(stats.zscore(df['return'])) < 2)]

มีปัญหาบางประการที่เกิดขึ้นเมื่อฉันพยายามทำงานเป็นกลุ่ม (และฉันแน่ใจว่าปัญหาเหล่านี้เกิดขึ้นเพราะฉันคุ้นเคยกับการเขียนโปรแกรมโดยใช้ลูป และต้องมีวิธีที่ "ชาญฉลาด" ในการดำเนินการนี้ใน Pandas)

ฉันไม่สามารถคำนวณคะแนน Z เมื่อมีค่า NaN ฉันได้รับข้อผิดพลาดนี้:

/home/jupyterlab/conda/lib/python3.6/site-packages/ipykernel_launcher.py:14: RuntimeWarning: invalid value encountered in less

ฉันจึงรู้ว่าต้องกำจัด NaN ออก แต่ฉันไม่สามารถทำในรูปแบบดาต้าเฟรมนี้ได้เนื่องจากจะหมายถึงการลบแถวหรือคอลัมน์ส่งผลให้ข้อมูลสูญหาย

อีกวิธีหนึ่งที่ฉันพยายามแต่ไม่ประสบความสำเร็จคือเปลี่ยนตารางนี้เป็นรูปแบบยาว ซึ่งหมายความว่าฉันจะมี:

    |  x  |  valueName  |  actualValue
 ---|-----|-------------|--------------
  0 |  1  |  value1     |      1       
  1 |  1  |  value2     |     NaN    
 ...  ...      ...            ...
  2 |  2  |  value2     |      4  
  3 |  2  |  value2     |     NaN

นี่ทำให้ฉันทิ้ง Nan แต่การใช้คะแนน Z มันเป็นปัญหามากกว่า ฉันแน่ใจว่านี่เป็นปัญหาทั่วไป แต่ฉันไม่สามารถทราบวิธีแก้ปัญหาได้


person Dan    schedule 27.03.2019    source แหล่งที่มา
comment
แล้วการเปลี่ยน NaN เป็น 0 ล่ะ?   -  person Sociopath    schedule 27.03.2019
comment
ฉันคิดว่าคำถามของคุณได้รับคำตอบแล้ว ที่นี่   -  person Yohai Magan    schedule 27.03.2019
comment
เป็นไปได้ที่ซ้ำกันของ วิธี zscore ทำให้คอลัมน์แพนด้าเป็นมาตรฐานด้วย nans ได้อย่างไร   -  person Yohai Magan    schedule 27.03.2019
comment
สวัสดี AhshayNevrekar ถ้าฉันทำอย่างนั้น ค่าเฉลี่ยจะได้รับผลกระทบ ในกรณี , 0.0 หรือ NaN ย่อมาจาก no-entry   -  person Dan    schedule 27.03.2019
comment
สวัสดี yochay magan ลิงก์ที่คุณโพสต์หมายถึงซีรีส์มิติเดียว ซึ่งฉันสามารถแก้ไขได้โดยใช้วิธี dropna   -  person Dan    schedule 27.03.2019


คำตอบ (1)


คุณสามารถใช้ได้:

from scipy import stats

#reshape to MultiIndex Series for remove NaNs
s = df.set_index('x').stack()
print (s)
x        
1  value1    1.0
   value3    3.0
   value4    1.0
2  value1    4.0
   value3    1.0
3  value1    2.0
   value2    6.0
   value3    1.0
   value4    2.0
4  value1    1.0
   value2    1.0
   value3    2.0
   value4    1.0
dtype: float64

#count zsore by first level of group - by x
s1 = s.groupby(level=0).transform(lambda x: np.abs(stats.zscore(x)))
print (s1)
x        
1  value1    0.707107
   value3    1.414214
   value4    0.707107
2  value1    1.000000
   value3    1.000000
3  value1    0.390567
   value2    1.692456
   value3    0.911322
   value4    0.390567
4  value1    0.577350
   value2    0.577350
   value3    1.732051
   value4    0.577350

#filter by condition and get mean by first level x, convert to DataFrame
s2 = s[s1 < 2].mean(level=0).reset_index(name='mean')
print (s2)
   x      mean
0  1  1.666667
1  2  2.500000
2  3  2.750000
3  4  1.250000
person jezrael    schedule 27.03.2019