2014-09-11 2 views
0

У меня есть этот dataframe:Все объекты Прошёл не было, Панды

data = {'My_name':["abc","nc","there",""] , 'Val1':[44.20,22,None,44],'Val2':[50,20,40,72.2]} 
df1 = pd.DataFrame(data) 

    My_name  Val1 Val2 
0 abc  44.2 50.0 
1 nc  22.0 20.0 
2 there  NaN 40.0 
3    44.0 72.2 
4 there  28 60 

И я использовал следующую инструкцию, чтобы получить среднее значение величин, основанный на My_name:

df2 = df1.where(pd.notnull(df1), None) 
dcm = df2.groupby(['My_name']).agg([np.mean]) 

Exception: All objects passed were None 

Я пытался различные тесты и реализовали ошибку из-за None, вычисляя среднее значение. Я попытался с помощью следующих вместо того, чтобы заботиться о None значений:

df3 = df2.where(pd.notnull(df2['Val1']), None) 
df4 = df3.where(pd.notnull(df3['Val2']), None) 
dcm2 = df4.groupby(['My_name']).agg([np.mean]) 

, но я все еще получаю ту же ошибку. Как игнорировать NaN, не испортив его?

Что-то вроде этого также будет делать: Создание двух данных. Один без значений None (в Val1 и Val2), а другой с None Values. например:

df_sub: 



     My_name  Val1 Val2 
    0 abc  44.2 50.0 
    1 nc  22.0 20.0 
    3    44.0 72.2 
    4 there  28 60 

и df_sub2:

My_name Val1 Val2 
3 there  Nan 40.0 

df.dropna() выглядит как хорошая функция, чтобы сделать это, так что я сделал:

df_sub = df2.dropna(subset=['Val1','Val2']) 

Как я получить второе dataframe?

+0

Почему вы пытаетесь заменить NaN на None? Значения NaN по умолчанию игнорируются средним значением. Так что просто делайте свою группировку на исходном фрейме данных 'df1.groupby (['My_name']). Agg ([np.mean])'. Это то, что вы хотите? (и в противном случае покажите свой ожидаемый результат для grouby) – joris

ответ

3

Во-первых, я не думаю, что вам нужно заменить NaN значения с None как NaN является показателем по умолчанию для пропущенных значений и будут игнорироваться mean по умолчанию в панд (mean имеет параметр skipna, что верно по по умолчанию).
Кроме того, заменив его на None, вы получите столбцы объекта dtype (а не числовые) и не все операции будут работать, как ожидалось.

Так просто попробовать сделать группировку операции по оригинальному dataframe:

dcm = df1.groupby(['My_name']).agg([np.mean]) 

Во-вторых, чтобы разделить ваш dataframe, вы можете сделать:

In [26]: df1[pd.isnull(df1[['Val1', 'Val2']]).any(axis=1)] 
Out[26]: 
    My_name Val1 Val2 
2 there NaN 40 

и в качестве альтернативы df1[pd.notnull(df1[['Val1', 'Val2']]).all(axis=1)] для другого подмножества, но это действительно эквивалентно коротким df1.dropna(subset=[['Val1','Val2']])

+0

, что None с Nan был хорошим моментом, который также помог мне решить ошибку. Благодаря.. !!! –