python - 来自具有非唯一数据的 Pandas 数组的多索引

标签 python pandas

我有以下数据框

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) 作为索引(或 MultiIndexes)的 MultiIndex?为了明确我的目标,这是我期望实现的目标:

             beta2[1] beta2[2]  beta2[3]   M[1]   M[2]   M[3]   shell[1]   shell[2]  shell[3]
   Z    A 
0  100  200  0.3112   -0.4197   0.03205    197.2  202    203    -4.213     -1.143    0
1  100  201  0.2967   0.4893    NaN        191    196.1  NaN    -4.434     -4.691    NaN
2  100  202  0.3084   -0.4873   NaN        183.4  188.2  NaN    -4.134     -4.75     NaN
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

我知道这至少涉及两个步骤,一个用于唯一性,一个用于 Z,A 中的索引,因此感谢其中一个步骤中的任何帮助,此外,是否有一些数据结构可能更适合这个问题?

编辑:我发现该行:

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

解决了Z,A的索引问题。不幸的是,这仅在 (Z,A) 对唯一时才有效。

最佳答案

我有一个 Unresolved 问题来解决这些问题:

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)

In [49]: group_position(df['Z'], df['A'])
Out[49]: array([0, 1, 2, 0, 1, 0, 1, 2, 0, 0])

现在将其用作辅助索引变量并拆栈:

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

关于python - 来自具有非唯一数据的 Pandas 数组的多索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10133021/

相关文章:

python - 将 PIL 图像转换为 wxPython 位图图像

python - 对 pandas 数据框切片进行排序的正确方法

python pandas dataframe resample.last 如何确保数据来自同一行

按列表顺序对 pandas DataFrame 进行排序

pandas - Pandas 箱线图中的 mustache 究竟说明了什么?

python - 比较不同 Pandas 数据框中的列

python - 脂肪 : can't figure out the architecture type of:/var/folders/

python - 如何在不从多 :prob 的开头开始的情况下,从其最后一次迭代中提升现有 xgboost 模型

python - 如何自动运行模块中的所有功能?

python - 如何使用 Django Tables 2 有条件地渲染链接列?