2015-01-25 4 views
0

Я пытаюсь сделать что-то подобное, но в гораздо большем dataframe (называется Clean):Подсчет сгруппированных данных с пропущенными значениями в панд dataframe

d={'rx': [1,1,1,1,2.1,2.1,2.1,2.1], 
    'vals': [NaN,10,10,20,NaN,10,20,20]} 
df=DataFrame(d) 


arrays = [df.rx,df.vals]      
index = pd.MultiIndex.from_arrays(arrays, names = ['rx','vals'])   
df.index = index 

Hist=df.groupby(level=('rx','vals')) 
Hist.count('vals') 

Это, кажется, работает нормально, но когда я бегу то же самое понятие о даже подмножестве чистого dataframe (заменяющего столбец «LagBin» для «вальса») я получаю сообщение об ошибке:

df1=DataFrame(data=Clean,columns=('rx','LagBin')) 
df1=df1.head(n=20) 

arrays = [df1.rx,df1.LagBin]      
index = pd.MultiIndex.from_arrays(arrays, names = ['rx','LagBin'])    
df1.index = index 

Hist=df1.groupby(level=('rx','LagBin')) 
Hist.count('LagBin') 

в частности, Hist.count («LagBin») выдает ошибку значения :

ValueError: Cannot convert NA to integer 

Я просмотрел структуру данных и все кажется абсолютно одинаковым.

Вот данные, которые выдает ошибку:

rx LagBin rx LagBin 
139.1 nan 139.1 
139.1 0 139.1 0 
139.1 0 139.1 0 
139.1 0 139.1 0 
141.1 nan 141.1 
141.1 10 141.1 10 
141.1 20 141.1 20 
193 nan 193 
193 50 193  50 
193 20 193  20 
193 3600 193  3600 
193 50 193  50 
193 0 193  0 
193 20 193  20 
193 10 193  10 
193 110 193  110 
193 80 193  80 
193 460 193  460 
193 30 193  30 
193 0 193  0 

в то время как оригинальная процедура, которая работает производит это:

rx vals rx vals 
1 nan  1 
1 10  1 10 
1 10  1 10 
1 20  1 20 
2.1 nan  2.1 
2.1 10  2.1 10 
2.1 20  2.1 20 
2.1 20  2.1 20 

Что отличает этих наборов данных, который производит эту ошибку?

ответ

0

Это выглядит правильно --- Я был мастерить с GroupBy и пришел с этим решением, которое кажется более элегантным, и не требует явного решения па-х:

df1=DataFrame(data=Clean,columns=('rx','LagBin')) 
df1=df1.head(n=20) 

df1["rx"].groupby((df1["rx"],df1["LagBin"])).count().reset_index(name="Count") 
print(LagCount) 

, который дает я:

 rx LagBin Count 
0 139.1  0  3 
1 141.1  10  1 
2 141.1  20  1 
3 193.0  0  2 
4 193.0  10  1 
5 193.0  20  2 
6 193.0  30  1 
7 193.0  50  2 
8 193.0  80  1 
9 193.0  110  1 
10 193.0  460  1 
11 193.0 3600  1 

Мне нравится это лучше, потому что я сохраняю значения как значения и не индексы, которые я предполагаю будет сделать жизнь легче позже для черчения.

1

Если я понять Ваш вопрос правильно, я считаю, что вы хотите:

Hist.agg(len).dropna() 

Полная реализация код выглядит следующим образом:

d={'rx': [139.1,139.1,139.1,139.1,141.1,141.1,141.1,193,193,193,193,193,193,193,193,193,193,193,193,193], 
    'vals': [nan,0,0,0,nan,10,20,nan,50,20,3600,50,0,20,10,110,80,460,30,0]} 
df=pd.DataFrame(d) 

arrays = [df.rx,df.vals]      
index = pd.MultiIndex.from_arrays(arrays, names = ['rx','vals'])   
df.index = index 

Hist=df.groupby(level=('rx','vals')) 
print(Hist.agg(len).dropna()) 

Где df выглядит следующим образом:

   rx vals 
rx vals    
139.1 NaN 139.1 NaN 
     0  139.1  0 
     0  139.1  0 
     0  139.1  0 
141.1 NaN 141.1 NaN 
     10 141.1 10 
     20 141.1 20 
193.0 NaN 193.0 NaN 
     50 193.0 50 
     20 193.0 20 
     3600 193.0 3600 
     50 193.0 50 
     0  193.0  0 
     20 193.0 20 
     10 193.0 10 
     110 193.0 110 
     80 193.0 80 
     460 193.0 460 
     30 193.0 30 
     0  193.0  0 

И линия Hist.agg(len).dropna() выглядит так:

   rx vals 
rx vals   
139.1 0  3  3 
141.1 10  1  1 
     20  1  1 
193.0 0  2  2 
     10  1  1 
     20  2  2 
     30  1  1 
     50  2  2 
     80  1  1 
     110 1  1 
     460 1  1 
     3600 1  1 
+0

Ваш ответ правильный, но мне не нравится, что rx и vals заполнены данными counts. Я опубликовал еще один подход, который также хорошо работает, сохраняет исходные значения в rx и LagBin и предоставляет новый столбец со значениями, которые я хочу. – TCS

Смежные вопросы