2017-02-18 1 views
1

선택한 행을 합산 할 때 이상한 동작을 나타내는 웹 데이터 (pandas DataFrame)를 컴파일했습니다.이상한 pandas.DataFrame.sum (축 = 1) 동작

DataFrame: 
In [178]: tdf.shape 
Out[178]: (47028, 57) 

In [201]: cols 
Out[201]: ['L1', 'L2', 'L3', 'L4', 'L5', 'W1', 'W2', 'W3', 'W4', 'W5'] 

In [177]: tdf[cols].head() 
Out[177]: 
L1 L2 L3 L4 L5 W1 W2 W3 W4 W5 
0 4.0 2 NaN NaN NaN 6.0 6 NaN NaN NaN 
1 3.0 3 NaN NaN NaN 6.0 6 NaN NaN NaN 
2 7.0 5 3 NaN NaN 6.0 7 6 NaN NaN 
3 1.0 4 NaN NaN NaN 6.0 6 NaN NaN NaN 
4 6.0 7 4 NaN NaN 7.0 5 6 NaN NaN 

tdf[cols].sum(axis=1)을 사용하여 행에 대한 합계를 계산할 때. 위의 표에서, 1 행의 합은 18.0해야하지만, 다음과 같이 10으로보고됩니다

In [180]: tdf[cols].sum(axis=1).head() 
Out[180]: 
0 10.0 
1  9.0 
2 13.0 
3  7.0 
4 13.0 
dtype: float64 

문제는, 특정 레코드 (행 13771)에 의한 것으로 보인다 때 때문에 이 행을 제외 합은 정확하게 계산된다

In [183]: tdf.iloc[:13772][cols].sum(axis=1).head() 
Out[183]: 
0 10.0 
1  9.0 
2 13.0 
3  7.0 
4 13.0 
dtype: float64 

전체 열의 잘못된 결과를 제공합니다

In [182]: tdf.iloc[:13771][cols].sum(axis=1).head() 
Out[182]: 
0 18.0 
1 18.0 
2 34.0 
3 17.0 
4 35.0 
dtype: float64 

를 포함하는 반면.

In [196]: tdf[cols].iloc[13771] 
Out[196]: 
L1  1 
L2  1 
L3 NaN 
L4 NaN 
L5 NaN 
W1  6 
W2  0 
W3 
W4 NaN 
W5 NaN 
Name: 13771, dtype: object 

In [197]: tdf[cols].iloc[13771].W3 
Out[197]: ' ' 

In [198]: type(tdf[cols].iloc[13771].W3) 
Out[198]: str 

을 나는 다음 버전 실행 해요 :

In [192]: sys.version 
Out[192]: '3.4.3 (default, Nov 17 2016, 01:08:31) \n[GCC 4.8.4]' 
In [193]: pd.__version__ 
Out[193]: '0.19.2' 
In [194]: np.__version__ 
Out[194]: '1.12.0' 

는 확실히 하나의 잘못 포맷 된 레코드가 다른 레코드의 합계에 영향을주지해야 다음과 같이

기분을 상하게하는 기록은 무엇입니까? 이 버그입니까 아니면 내가 잘못하고있는 거지?

도움 주시면 감사하겠습니다.

답변

0

문제 empty string 함께 - 다음의 열 W3dtype는 (분명 string) object이고 sum는 생략.

솔루션 :

tdf[cols] = tdf[cols].replace({'':np.nan}) 
#if necessary 
tdf[cols] = tdf[cols].astype(float) 

또 다른 해결책 :

다음 NaN에 문제가 empty string 값을 교체 시도는 float

tdf.loc[13771, 'W3'] = np.nan 

tdf.W3 = tdf.W3.astype(float) 

또는 일부 colsNaN 모든 빈 문자열을 대체하려고 캐스팅 문제가있는 용도로 to_numeric을 사용하고 있습니다. 열 cols 신청 일반적으로

tdf.W3 = pd.to_numerice(tdf.W3, erors='coerce') 

을 또는 : - C 열 NaN 모든 숫자가 아닌 교체 포인터 및 빠른 응답을위한

tdf[cols] = tdf[cols].apply(lambda x: pd.to_numeric(x, errors='coerce')) 
+0

감사합니다. 'to_numeric'을 적용하면 트릭을 수행합니다! 그러나 문자열 기록에서 자동으로 실패한 사실은 바람직하지 않은 것으로 보입니다. 나는 이것과 함께 갈 것이다. – Muchadoaboutnothing