具有非唯一d的Pandas数组中的多索引

2024-06-01 01:39:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧

In[45]: data[:10]  
Out[45]:
   Z    A    beta2    M      shell
0  100  200  0.3112   197.2 -4.213
1  100  200 -0.4197   202   -1.143
2  100  200  0.03205  203    0    
3  100  201  0.2967   191   -4.434
4  100  201 -0.4893   196.1 -4.691
5  100  202  0.3084   183.4 -4.134
6  100  202 -0.4873   188.2 -4.75 
7  100  202 -0.2483   188.4 -1.106
8  100  203  0.3069   177.1 -4.355
9  101  203 -0.4956   182.5 -5.217

我的问题是,如何将数据分组/转换成这样一种方式,即使用(Z,a)作为索引的多重索引(或多重索引),同时考虑到数据不是唯一的?为了明确我的目标,我希望实现以下目标:

^{pr2}$

我知道这至少包括两个步骤,一个是唯一性步骤,另一个是Z索引步骤,所以请在其中一个步骤中提供任何帮助,还有,有没有某种数据结构更适合这个问题?在

编辑:我发现这一行:

data=data.set_index(('Z','A'))

解决了Z,A中的索引问题。不幸的是,这只在(Z,A)对是唯一的情况下才有效。在


Tags: 数据in编辑数据结构目标dataindex方式
1条回答
网友
1楼 · 发布于 2024-06-01 01:39:30

我有一个公开的问题要解决这些问题:

https://github.com/pydata/pandas/issues/388

这里有一个解决方案。首先用一个简单的(不是很有效的)函数来得到群序数:

def group_position(*args):
    """
    Get group position
    """
    from collections import defaultdict
    table = defaultdict(int)

    result = []
    for tup in zip(*args):
        result.append(table[tup])
        table[tup] += 1

    return np.array(result)

^{pr2}$

现在将其用作辅助索引变量并取消堆叠:

In [52]: df
Out[52]: 
     Z    A    beta2      M  shell
0  100  200  0.31120  197.2 -4.213
1  100  200 -0.41970  202.0 -1.143
2  100  200  0.03205  203.0  0.000
3  100  201  0.29670  191.0 -4.434
4  100  201 -0.48930  196.1 -4.691
5  100  202  0.30840  183.4 -4.134
6  100  202 -0.48730  188.2 -4.750
7  100  202 -0.24830  188.4 -1.106
8  100  203  0.30690  177.1 -4.355
9  101  203 -0.49560  182.5 -5.217

In [53]: df['pos'] = group_position(df['Z'], df['A'])

In [54]: df.set_index(['Z', 'A', 'pos']).unstack('pos')
Out[54]: 
          beta2                       M                shell              
pos           0       1        2      0      1      2      0      1      2
Z   A                                                                     
100 200  0.3112 -0.4197  0.03205  197.2  202.0  203.0 -4.213 -1.143  0.000
    201  0.2967 -0.4893      NaN  191.0  196.1    NaN -4.434 -4.691    NaN
    202  0.3084 -0.4873 -0.24830  183.4  188.2  188.4 -4.134 -4.750 -1.106
    203  0.3069     NaN      NaN  177.1    NaN    NaN -4.355    NaN    NaN
101 203 -0.4956     NaN      NaN  182.5    NaN    NaN -5.217    NaN    NaN

最后一次咀嚼,完全像你展示的那样:

In [61]: result = df.set_index(['Z', 'A', 'pos']).unstack('pos')

In [62]: result.rename(columns=lambda x: '%s[%d]' % (x[0], x[1]+1)).reset_index()
Out[62]: 
     Z    A  beta2[1]  beta2[2]  beta2[3]   M[1]   M[2]   M[3]  shell[1]  shell[2]  shell[3]
0  100  200    0.3112   -0.4197   0.03205  197.2  202.0  203.0    -4.213    -1.143     0.000
1  100  201    0.2967   -0.4893       NaN  191.0  196.1    NaN    -4.434    -4.691       NaN
2  100  202    0.3084   -0.4873  -0.24830  183.4  188.2  188.4    -4.134    -4.750    -1.106
3  100  203    0.3069       NaN       NaN  177.1    NaN    NaN    -4.355       NaN       NaN
4  101  203   -0.4956       NaN       NaN  182.5    NaN    NaN    -5.217       NaN       NaN

相关问题 更多 >