Pandas DataFrame:按名称追加索引到df的结尾

时间:2015-02-11 10:49:33

标签: pandas append dataframe rows reindex

我的df看起来像:

df_table
Name       exp1
bnb_q8a12    41
bnb_q8a8     36
bnb_q8a2     30
_xexp0       20
_xexp73      16
bnb_q8a7     10
_xexp216     10
bnb_q8a3     10

我希望df看起来像这样,所有索引都命名为" Net:_xexp .."附在df的末尾。

df_table
Name       exp1
bnb_q8a12         41
bnb_q8a8          36
bnb_q8a2          30
bnb_q8a7          10
bnb_q8a3          10
Net: _xexp0       20
Net: _xexp73      16
Net: _xexp216     10

我目前正在追加这样的给定索引,但我确定有更好的方法吗?

res = df_table.index.tolist()
nets = []
for i in df_table.index:
    if 'Net: ' in i:
        nets.append(res.pop(res.index(i)))

res.extend(nets)
df_table = df_table.reindex(res)

1 个答案:

答案 0 :(得分:1)

使用向量化的str.contains方法来屏蔽包含字符串的行的df并添加str。 由于它当前是您的索引,因此重置索引以将其还原为列可能更简单,然后过滤行并添加文本,在过滤的行上使用concat对其重新排序,然后再次设置索引:

In [64]:

df = df.reset_index()
df.loc[df.Name.str.contains('_xexp'), 'Name'] = 'Net: ' + df.Name
df
Out[64]:
            Name  exp1
0      bnb_q8a12    41
1       bnb_q8a8    36
2       bnb_q8a2    30
3    Net: _xexp0    20
4   Net: _xexp73    16
5       bnb_q8a7    10
6  Net: _xexp216    10
7       bnb_q8a3    10

In [65]:

df = pd.concat([df[~df.Name.str.contains('_xexp')], df[df.Name.str.contains('_xexp')]])
df
Out[65]:
            Name  exp1
0      bnb_q8a12    41
1       bnb_q8a8    36
2       bnb_q8a2    30
5       bnb_q8a7    10
7       bnb_q8a3    10
3    Net: _xexp0    20
4   Net: _xexp73    16
6  Net: _xexp216    10
In [66]:

df = df.set_index('Name')
df
Out[66]:
               exp1
Name               
bnb_q8a12        41
bnb_q8a8         36
bnb_q8a2         30
bnb_q8a7         10
bnb_q8a3         10
Net: _xexp0      20
Net: _xexp73     16
Net: _xexp216    10