2012-12-13 7 views
0

나는 물리학 코드를 작성하기 위해 팬더 (0.9.1)를 사용하고 있습니다.팬더 그룹화되고 정상적인 데이터 프레임에 가입하십시오

레벨 :

class 'pandas.core.frame.DataFrame'> 
Int64Index: 37331 entries, 0 to 37330 
Data columns: 
atomic_number 37331 non-null values 
ion_number  37331 non-null values 
level_number  37331 non-null values 
energy   37331 non-null values 
g    37331 non-null values 
metastable  37331 non-null values 

라인 : 나는 두 dataframes이

내가해야 할 몇 가지있다
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 314338 entries, 0 to 314337 
Data columns: 
id     314338 non-null values 
wavelength   314338 non-null values 
atomic_number   314338 non-null values 
ion_number   314338 non-null values 
f_ul     314338 non-null values 
f_lu     314338 non-null values 
level_number_lower 314338 non-null values 
level_number_upper 314338 non-null values 
dtypes: float64(3), int64(7) 

: 나는 선 (원자, 이온 수준에 가입 할 필요가, 레벨) : 처음에는 원자, 이온, level_number_upper 그리고 원자, 이온, level_number_lower. 조인을 미리 계산할 수있는 방법이 있습니까? 메모리는 문제가 아니지만 속도는 중요합니다.

또한 레벨 (원자, 이온)을 그룹화하고 레벨을 조작해야합니다. 나는 이것을 (이미 믿을 수 없을만큼 빠름) 이미했으나 결과 시리즈를 라인 데이터 프레임에 결합하는 데 어려움을 겪었다.

어떻게하면됩니까?

건배 볼프강

업데이트 v1의

내가

def calc_group_func(group): 
    return np.sum(group['g']*np.exp(-group['energy']) 
grouped_data = levels.group_by('atomic_number', 'ion_number') 
grouped_data.apply(calc_group_func) 

하고 난에 줄 그룹화 된 데이터를/가입 병합 할 코드 조각을 여기에 병합에 가입 할 것을 표시하려면 atomic_number 및 ion_number

+0

먼저 가입/병합을 수행 한 다음 groupby를 수행 하시겠습니까? –

+0

그래서 Dataframe 레벨은 라인 데이터 프레임보다 훨씬 짧습니다. groupby 전에 조인/병합을 수행하는 데 많은 비용이들 것입니다. –

+0

확인하려면 groupby 객체를 데이터 프레임과 병합/결합하고 싶습니까? –

답변

1

더 좋은 방법이 있을지 모르지만 df.merge()가 여기에서 작동 할 수 있습니다. df.merge()는 두 개의 DataFrames에서 작동하므로 apply() 후 Series에있는 각 (atom, ion) 쌍에 대해 계산 된 값은 DataFrame에 먼저 배치해야합니다. 또한 지정할 수 있습니다.

In [9]: grouped_vals = grouped_data.apply(calc_group_func) 

In [10]: grouped_vals 
Out[10]: 
atomic_number ion_number 
0    0    0.517541 
       1    0.046833 
1    0    0.253188 
       1    0.440194 

In [11]: lines.merge(pd.DataFrame({'group_val': grouped_vals}), 
    ....:    left_on=['atomic_number', 'ion_number'], 
    ....:    right_index=True) 
Out[11]: 
    atomic_number ion_number group_val 
id          
a    0   0 0.517541 
b    0   0 0.517541 
c    0   1 0.046833 
d    0   1 0.046833 
e    1   0 0.253188 
f    1   0 0.253188 
g    1   1 0.440194 
h    1   1 0.440194 
관련 문제