1

我在具有多索引的 HDFStore 中将 frame_table 称为“数据”。在 DataFrame 中,它可能看起来像这样

                      var1   var2  var3  var4  var5  var6
x_coor y_coor date                                        
928    310    2006257   133  14987  7045    18   240   171
              2006273   136      0  7327    30   253   161
              2006289   125      0  -239    83   217   168
              2006305    95  14604  6786    13   215    57
              2006321    84      0  4548    13   133    88

但现在我想在右侧添加一列范围(从 1 开始)。我的计划: 1. 使用范围创建新节点 2. 将两个节点连接到新节点中

我所做的,首先创建一个新节点(存储为 DataFrame),然后在重置列时连接

store['rindex'] = pd.DataFrame(pd.Series(xrange(1,
                  len(store.root.all_data.table)+1)))
store['rall']=pd.concat([store['all_data'].reset_index(),
              store['rindex'].reset_index()],ignore_index=True,axis=1)

但现在这两个索引都是我数据的一部分(在第 0、1、2、10 列中):

 0   1     2     3    5    6    7  8   9  10 11
928 310 2006257 133 14987 7045 18 240 171 0   1
928 310 2006273 136     0 7327 30 253 161 1   2
928 310 2006289 125     0 -239 83 217 168 2   3
928 310 2006305 95  14604 6786 13 215 57  3   4
928 310 2006321 84      0 4548 13 133 88  4   5

<class 'pandas.core.frame.DataFrame'>
Int64Index: 203 entries, 0 to 202
Data columns (total 11 columns):
0     203  non-null values
1     203  non-null values
2     203  non-null values
3     203  non-null values
4     203  non-null values
5     203  non-null values
6     203  non-null values
7     203  non-null values
8     203  non-null values
9     203  non-null values
10    203  non-null values
dtypes: int32(7), int64(4)

我使用它尝试了以下操作,但这会导致空虚:

>>> store['selection'] = store.select('all_data', [pd.Term('index', '>', '0')])
>>> store['selection'].reindex(columns = ['3','4','5','6','7','8','10'])
<class 'pandas.core.frame.DataFrame'>
Int64Index: 203 entries, 0 to 202
Data columns (total 7 columns):
3     0  non-null values
4     0  non-null values
5     0  non-null values
6     0  non-null values
7     0  non-null values
8     0  non-null values
10    0  non-null values
dtypes: float64(7)

那么如何在不清空值的情况下选择这些列呢?

4

1 回答 1

2

您的原始框架

In [19]: df2
Out[19]: 
                     var1   var2  var3  var4  var5  var6
x_cor y_cor date                                        
928   310   2006257   133  14987  7045    18   240   171
            2006273   136      0  7327    30   253   161
            2006289   125      0  -239    83   217   168
            2006305    95  14604  6786    13   215    57
            2006321    84      0  4548    13   133    88

reset_index 和 set_index 与原始帧可逆

In [20]: df2.reset_index()
Out[20]: 
   x_cor  y_cor     date  var1   var2  var3  var4  var5  var6
0    928    310  2006257   133  14987  7045    18   240   171
1    928    310  2006273   136      0  7327    30   253   161
2    928    310  2006289   125      0  -239    83   217   168
3    928    310  2006305    95  14604  6786    13   215    57
4    928    310  2006321    84      0  4548    13   133    88

In [21]: df2.reset_index().set_index(['x_cor','y_cor','date'])
Out[21]: 
                     var1   var2  var3  var4  var5  var6
x_cor y_cor date                                        
928   310   2006257   133  14987  7045    18   240   171
            2006273   136      0  7327    30   253   161
            2006289   125      0  -239    83   217   168
            2006305    95  14604  6786    13   215    57
            2006321    84      0  4548    13   133    88

给列编号

In [23]: df2['range'] = range(len(df2))

In [24]: df2
Out[24]: 
                     var1   var2  var3  var4  var5  var6  range
x_cor y_cor date                                               
928   310   2006257   133  14987  7045    18   240   171      0
            2006273   136      0  7327    30   253   161      1
            2006289   125      0  -239    83   217   168      2
            2006305    95  14604  6786    13   215    57      3
            2006321    84      0  4548    13   133    88      4

您需要将多索引框架与索引集一起存储(否则它只是一个常规索引框架)。

您的重新索引步骤不会做任何事情,因为您通过字符串而不是数字重新索引(例如,'1','2' 与 1,2 不同)

你的数据真的很大吗?为什么您不只是从存储中读取帧,在内存中进行修改,然后将其写回(到原始位置或新位置)。

您正在谈论的基本上创建索引列存储的策略只有在您拥有大量数据时才有意义。

于 2013-07-12T12:33:56.313 回答