2013-08-24 10 views
5

어떤 이유로이 병합을 제대로 수행 할 수 없습니다.팬더의 데이터 프레임 병합

이 Dataframe (rspars)는 2,000 개 이상의 행을 가지고 있습니다 ...

rsparid f1mult f2mult f3mult 
0  1 0.318 0.636 0.810 
1  2 0.348 0.703 0.893 
2  3 0.384 0.777 0.000 
3  4 0.296 0.590 0.911 
4  5 0.231 0.458 0.690 
5  6 0.275 0.546 0.839 
6  7 0.248 0.486 0.731 
7  8 0.430 0.873 0.000 
8  9 0.221 0.438 0.655 
9  11 0.204 0.399 0.593 

이 Dataframe에 rsparid 열을 기반으로 테이블에 위의 가입하려고 ...

  line_track line_race rsparid 
line_date        
2013-03-23   TP   10 1400 
2013-02-23   GP   7  634 
2013-01-01   GP   7 1508 
2012-11-11  AQU   5  96 
2012-10-11  BEL   2  161 

이 사용 ...

df = pd.merge(datalines, rspars, how='left', on='rsparid') 

나는 공백을 얻을 ..

line_track line_race rsparid f1mult f2mult f3mult 
0   TP   10 1400  NaN  NaN  NaN 
1   TP   10 1400  NaN  NaN  NaN 
2   TP   10 1400  NaN  NaN  NaN 
3   GP   7  634  NaN  NaN  NaN 
4   GP   10  634  NaN  NaN  NaN 

"datalines"열은 rspars보다 수천 개의 행을 가질 수 있으므로 왼쪽 조인에 유의하십시오. 뭔가 잘못하고있는 것 같아? 나는 몇 행까지 데이터를 드롭 2

나는 또한이 방법을 시도 ...

df = datalines.merge(rspars, how='left', on='rsparid') 

예제 # ...

rspars :

rsparid f1mult f2mult f3mult 
0  1400 0.216 0.435 0.656 

데이터 라인 :

rsparid 
0 1400 
1  634 
2 1508 
3  96 
4  161 
5 1011 
6 1007 
7  518 
8 1955 
9  678 

병합 ...

datalines.merge(rspars, how='left', on='rsparid') 

출력 ...

rsparid f1mult f2mult f3mult 
0 1400  NaN  NaN  NaN 
1  634  NaN  NaN  NaN 
2 1508  NaN  NaN  NaN 
3  96  NaN  NaN  NaN 
4  161  NaN  NaN  NaN 
5 1011  NaN  NaN  NaN 
6 1007  NaN  NaN  NaN 
7  518  NaN  NaN  NaN 
8 1955  NaN  NaN  NaN 
9  678  NaN  NaN  NaN 
+0

'데이터 라인'을 약간 보여줄 수 있습니까? –

+0

첫 번째 표시된 데이터 프레임은 rspars입니다. datalines 테이블에는 수십 개의 필드가 있고 그 중 하나는 rsparid입니다. – TravisVOX

+0

나는 명확성을 위해 좀 더 많은 정보를 추가했다. – TravisVOX

답변

4

NaN의 그들이 공통으로 rsparid에 값이없는 것을 의미한다. 그들이

(정수) 문자열이나 정수와 작은 DataFrames의에 repr가 동일하게 보이는 repr 및 프레임이 작은 경우에는 dtype 정보가 인쇄되어 있지 않은 경우 동일 보일 수 있습니다 일을 병합 할 때이 까다로운 일이 될 수 있습니다. DataFrame.info() 메소드를 호출하여 작은 프레임에 대해이 정보를 얻을 수 있습니다 (예 : df.info()).

In [205]: datalines_int = DataFrame({'rsparid':[1400,634,1508,96,161,1011,1007,518,1955,678]}) 

In [206]: datalines_str = DataFrame({'rsparid':map(str,[1400,634,1508,96,161,1011,1007,518,1955,678])}) 

In [207]: datalines_int 
Out[207]: 
    rsparid 
0  1400 
1  634 
2  1508 
3  96 
4  161 
5  1011 
6  1007 
7  518 
8  1955 
9  678 

In [208]: datalines_str 
Out[208]: 
    rsparid 
0 1400 
1  634 
2 1508 
3  96 
4  161 
5 1011 
6 1007 
7  518 
8 1955 
9  678 

In [209]: datalines_int.info() 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 10 entries, 0 to 9 
Data columns (total 1 columns): 
rsparid 10 non-null values 
dtypes: int64(1) 

In [210]: datalines_str.info() 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 10 entries, 0 to 9 
Data columns (total 1 columns): 
rsparid 10 non-null values 
dtypes: object(1) 

참고 : 당신은 여기 repr의에서 약간의 차이를, 가장 가능성이 알 수 있습니다 이것은 당신에게 니스 DataFrame에 무엇이 요약과 열의 dtype의가 무엇을 줄 것이다 숫자 의 패딩 때문입니다. 요컨대, 차이를 특별히 찾지 않는 한 아무도 대화식으로 사용하는 것을 실제로 볼 수 없습니다.

+0

rsparid가 존재 함을 보여주기 위해 rspar 테이블을 어떻게 인덱스했는지 예제에 추가했습니다. 'read_csv'를 통해 CSV 파일에서 곧바로 나오고 rsparid가 확실히 거기에 있습니다. – TravisVOX

+0

'병합'에 대한 오해가 있다고 생각합니다. 'datalines.rsparid'에'rspars.rsparid'의 값과 동일한 * 값 *이 없다면 조인 할 것이 없으므로'NaN'을 얻습니다. –

+0

두 번째 예에서 데이터를 줄인 두 번째 예제를 확인해도 여전히 문제가 있습니다. – TravisVOX

관련 문제