Pandas - 使用字符串通配符进行多索引切片/设置

时间:2017-06-17 16:56:46

标签: python pandas dataframe slice multi-index

环顾四周,真的很难搞清楚这个。我想要 在一行代码片中并设置一个pandas DataFrame的多个单元格 达到相同的价值。

蓝色突出显示的部分是我想要设置的。

此工作要设置 - 但它只是一个值:

dframe2.ix[('virname1','int3', 'sysname1')]['Switchport_Voice_VLAN2'] = 'test'

这两种方法都有效,但未设置:

dframe2.iloc[dframe2.index.get_level_values(0) == 'virname1' ]['Switchport_Voice_VLAN2']


dframe2.iloc['virname1', slice(None), 'sysname1']['Switchport_Voice_VLAN2']

有人可以建议是否有更好的方法吗?

>>> dframe2
                       Switchport_Voice_VLAN Switchport_Voice_VLAN2
virname1 int1 sysname1                horses                    NaN
virname2 int2 sysname2                   NaN                 horses
virname1 int2 sysname1                horses                 newval
         int3 sysname1                horses                   test
         int4 sysname1                horses                 newval

1 个答案:

答案 0 :(得分:0)

使用df.loc按标签选择行和/或列。

使用df.iloc按顺序索引选择行和/或列。

Pandas版本0.20.0中的

df.ix is deprecated,因此请避免使用它来验证您的代码。

在这种情况下,请使用df.loc 'virname1''sysname1''Switchport_Voice_VLAN2' df = df.sort_index(axis=0) 都是标签。

另请注意,在切片MultiIndex时,index must be fully lexsorted

df.loc

最后,使用df.loc[('virname1', slice(None), 'sysname1'), 'Switchport_Voice_VLAN2'] = 'test' ,您可以同时对行和列进行切片:

import numpy as np
import pandas as pd
index = pd.MultiIndex.from_arrays([
    ['virname{}'.format(i) for i in [1,2,1,1,1]],
    ['int{}'.format(i) for i in [1,2,2,3,4]],
    ['sysname{}'.format(i) for i in [1,2,1,1,1]]])
df = pd.DataFrame({'Switchport_Voice_VLAN':['horses',np.nan,'horses','horses','horses'], 
                   'Switchport_Voice_VLAN2':[np.nan,'horses','newval','test','newval']},
                  index=index)
df = df.sort_index(axis=0)
df.loc[('virname1', slice(None), 'sysname1'), 'Switchport_Voice_VLAN2'] = 'test'
print(df)

例如,

                       Switchport_Voice_VLAN Switchport_Voice_VLAN2
virname1 int1 sysname1                horses                   test
         int2 sysname1                horses                   test
         int3 sysname1                horses                   test
         int4 sysname1                horses                   test
virname2 int2 sysname2                   NaN                 horses

产量

@bot.command()
async def randomimage(*args):
    """Displays a random image of said thing"""
    q = ''

    for arg in enumerate(args):
      q += urllib.parse.quote(arg) + '+'

    f = urllib2.urlopen('http://ajax.googleapis.com/ajax/services/search/images?q=' + q + '&v=1.0&rsz=large&start=1')
    data = json.load(f)
    f.close()