0

我正在使用 Pandas (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

线路:

<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)

我需要做几件事:我需要用线(原子、离子、级别)连接级别:首先在 atom、ion、level_number_upper 上,然后在 atom、ion、level_number_lower 上。有没有办法预先计算连接 - 内存不是问题,但速度是。

我还需要对级别进行分组(在原子、离子上)并在级别上进行操作。我已经这样做了(非常快),但是在将结果系列与 lines 数据框连接起来时遇到了麻烦。

我该怎么做呢?

干杯沃尔夫冈

更新 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 上的行加入/合并分组数据

4

1 回答 1

2

可能有更好的方法,但也许 df.merge() 会在这里工作。df.merge() 作用于两个DataFrame,因此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
于 2012-12-16T03:21:12.300 回答