我想拆分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。 有没有更好的方法呢? 最好。
答案 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