pandas:拆分索引字符串并汇总相等切片的行

时间:2014-10-02 16:07:22

标签: python pandas

我想拆分DataFrame的行索引字符串并对等于切片的行求和。类似的东西:

idx       val1 val2 val3
con-991-1 1    1    1
con-991-2 1    0    1
con-732   0    0    0
con-55-1  1    0    1
con-55-2  0    1    1 

转向:

con-991   2    1    2
con-732   0    0    0
con-55    1    1    2

这就是我到目前为止所做的事情:

df = DataFrame()
df['new'] = df1.index
df = DataFrame(df.new.str.split('-').tolist(), index=df1.index, columns=['pre', 'med', 'sux'])
dfnew = concat([df1, df], axis=1, ignore_index=False)
dfnew['index'] = dfnew.index
dfnew.reset_index(level=0, inplace=True)
#dfnew.index = MultiIndex.from_tuples(list(zip(dfnew['index'], dfnew[1])), names=['base1', 'base2'])           
print(dfnew.groupby(['index', 'med']).sum())

我的代码不起作用,绝对不是pythonic。 有没有更好的方法呢? 最好。

1 个答案:

答案 0 :(得分:7)

我认为你的方法并不遥远。首先,构建一个您要分组的新系列,然后调用sum

>>> new_index = df.index.to_series().str.split("-").str[:2].str.join("-")
>>> df.groupby(new_index).sum()
         val1  val2  val3
idx                      
con-55      1     1     2
con-732     0     0     0
con-991     2     1     2

或者

>>> df.groupby(new_index, as_index=False).sum()
       idx  val1  val2  val3
0   con-55     1     1     2
1  con-732     0     0     0
2  con-991     2     1     2

可能有助于打破new_index。我们可以简单地调用str

,而不是向框架添加新系列以便我们可以访问to_series方法
>>> df.index
Index([u'con-991-1', u'con-991-2', u'con-732', u'con-55-1', u'con-55-2'], dtype='object')
>>> df.index.to_series()
idx
con-991-1    con-991-1
con-991-2    con-991-2
con-732        con-732
con-55-1      con-55-1
con-55-2      con-55-2
Name: idx, dtype: object

然后像你一样分裂:

>>> df.index.to_series().str.split("-")
idx
con-991-1    [con, 991, 1]
con-991-2    [con, 991, 2]
con-732         [con, 732]
con-55-1      [con, 55, 1]
con-55-2      [con, 55, 2]
Name: idx, dtype: object

然后我们可以使用切片来获取每个列表的前两个元素:

>>> df.index.to_series().str.split("-").str[:2]
idx
con-991-1    [con, 991]
con-991-2    [con, 991]
con-732      [con, 732]
con-55-1      [con, 55]
con-55-2      [con, 55]
Name: idx, dtype: object

最后我们join

>>> df.index.to_series().str.split("-").str[:2].str.join("-")
idx
con-991-1    con-991
con-991-2    con-991
con-732      con-732
con-55-1      con-55
con-55-2      con-55
Name: idx, dtype: object