Как заполнить пустоты (Nan) в Dataframe средними значениями этого столбца? - PullRequest
2 голосов
/ 01 октября 2019

У меня есть датафрейм с 4 столбцами: ch_name, время, значения и интервал. Я хочу проверить, если "интервал" <300 секунд проверить NaN из столбца "значения". Если есть значения NAN, тогда заполните NAN средним значением этого столбца {'values'}. </p>

[1798 rows x 2 columns]
                     value  interval
time                                
2019-09-26 00:02:00    0.0      60.0
2019-09-26 00:03:00    0.0      60.0
2019-09-26 00:04:00    0.0      60.0
2019-09-26 00:05:00    0.0      60.0
2019-09-26 00:06:00    0.0      60.0
...                    ...       ...
2019-09-27 05:55:00    0.0      60.0
2019-09-27 05:56:00    0.0      60.0
2019-09-27 05:57:00    0.0      60.0
2019-09-27 05:58:00    0.0      60.0
2019-09-27 05:59:00    0.0      60.0

[1798 rows x 2 columns]
                     value  interval
time                                
2019-09-26 00:02:00    1.0      60.0
2019-09-26 00:03:00    1.0      60.0
2019-09-26 00:04:00    1.0      60.0
2019-09-26 00:05:00    1.0      60.0
2019-09-26 00:06:00    1.0      60.0
...                    ...       ...
2019-09-27 05:55:00    1.0      60.0
2019-09-27 05:56:00    1.0      60.0
2019-09-27 05:57:00    1.0      60.0
2019-09-27 05:58:00    1.0      60.0
2019-09-27 05:59:00    1.0      60.0

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

Решения для заполненного числа всех значений столбца value:

mask = df['interval'] < 300
df.loc[mask, 'value'] = df.loc[mask, 'value'].fillna(df['value'].mean())

Или:

mask1 = (df['interval'] < 300) & df['value'].isna()
df.loc[mask1, 'value'] = df['value'].mean()

Образец :

print (df)
                     value  interval
time                                
2019-09-26 00:02:00    NaN      60.0
2019-09-26 00:03:00    NaN     400.0
2019-09-26 00:04:00    2.0      60.0
2019-09-26 00:05:00    3.0      60.0
2019-09-26 00:06:00   10.0     600.0


mask1 = (df['interval'] < 300) & df['value'].isna()
df.loc[mask1, 'value'] = df['value'].mean()

print (df)
                     value  interval
time                                
2019-09-26 00:02:00    5.0      60.0
2019-09-26 00:03:00    NaN     400.0
2019-09-26 00:04:00    2.0      60.0
2019-09-26 00:05:00    3.0      60.0
2019-09-26 00:06:00   10.0     600.0

Решения для заполненных средних только по строкам, где interval < 300:

mask = df['interval'] < 300
df.loc[mask, 'value'] = df.loc[mask, 'value'].fillna(df.loc[mask, 'value'].mean())

Или:

mask1 = (df['interval'] < 300) & df['value'].isna()
df.loc[mask1, 'value'] = df.loc[(df['interval'] < 300), 'value'].mean()

print (df)
                     value  interval
time                                
2019-09-26 00:02:00    2.5      60.0
2019-09-26 00:03:00    NaN     400.0
2019-09-26 00:04:00    2.0      60.0
2019-09-26 00:05:00    3.0      60.0
2019-09-26 00:06:00   10.0     600.0
1 голос
/ 01 октября 2019

вы можете использовать numpy, чтобы решить эту проблему, возьмите столбец фрейма данных, который вы хотите заполнить средним значением в вашем случае. Df ['interval'] проверяет, есть ли пустое значение из nan, возвращает индекс, где null, затемзамените на значение, которое вы хотите, в вашем случае df [where_are_NaNs] = означает

import pandas as pd
from numpy import *
data = [['tom', 10], ['nick', ], ['juli', 14]]  #my empty cell in dataframe 
# Create the pandas DataFrame 
df = pd.DataFrame(data, columns = ['Name', 'Age']) 


where_are_NaNs = isnan(df['Age'])
df[where_are_NaNs] = 0.0

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...