我有一个DataFrame df,我已经'合并了'。我正在寻找一个类似于get_group(name)的函数,除了如果名称不存在而不是抛出KeyError,返回一个空的DataFrame(或其他一些值),类似于dict.get的工作原理: / p>
g = df.groupby('x')
# doesn't work, but would be nice:
i = g.get_group(1, default=[])
# does work, but is hard to read:
i = g.obj.take(g.indices.get(1, []), g.axis)
是否已有提供此功能的功能?
编辑:
在很多方面,GroupBy对象由一个dict(.indicies,.groups)表示,而这个'get with default'功能足以构成一个dict的概念,它包含在Python语言本身中。似乎如果一个类似dict的东西没有默认的get,也许我不能正确理解它?为什么一个类似于dict的东西没有'得到默认'?
我想要做的缩写示例是:
df1_bymid = df1.groupby('mid')
df2_bymid = df2.groupby('mid')
for mid in set(df1_bymid.groups) | set(df2_bymid.groups) :
rows1 = df1_bymid.get_group(mid, [])
rows2 = df1_bymid.get_group(mid, [])
for row1, row2 in itertools.product(rows1, rows2) :
yield row1, row2
当然我可以创建一个函数,我可能,似乎如果我必须走得太远,也许我没有按照预期的方式使用GroupBy对象:
def get_group(df, name, obj=None, default=None) :
if obj is None :
obj = df.obj
try :
inds = df.indices[name]
except KeyError, e :
if default is None :
raise e
inds = default
return df.obj.take(inds, df.axis)
答案 0 :(得分:3)
我可以将自己的get_group()
定义为以下
In [55]: def get_group(g, key):
....: if key in g.groups: return g.get_group(key)
....: return pd.DataFrame()
....:
In [52]: get_group(g, 's1')
Out[52]:
Mt Sp Value count
0 s1 a 1 3
1 s1 b 2 2
In [54]: get_group(g, 's4')
Out[54]:
Empty DataFrame
Columns: []
Index: []
答案 1 :(得分:1)
它不是那么漂亮,但你可以这样做:
设置:
>>> df = pandas.DataFrame([[1,2,3],[4,5,6],[1,8,9]], columns=['a','b','c'])
>>> df
a b c
0 1 2 3
1 4 5 6
2 1 8 9
>>> g = df.groupby('a')
现在g.get_group
要求传递的密钥存在于基础groups
dict中,但您可以自己访问该成员,实际上它是一个普通的python dict
。它将组值用于索引集合:
>>> g.groups
{1: Int64Index([0, 2], dtype='int64'), 4: Int64Index([1], dtype='int64')}
>>> type(g.groups)
<type 'dict'>
如果您在数据框的索引位置函数中使用这些返回的索引,则可以使get_group
以相同的方式使用您的组:
>>> df.loc[g.groups[1]]
a b c
0 1 2 3
2 1 8 9
由于groups
是dict
,您可以使用get
方法。如果不提供默认值,则会返回None
,这将导致loc
引发异常。但它会接受一个空列表:
>>> df.loc[g.groups.get(1, [])]
a b c
0 1 2 3
2 1 8 9
>>> df.loc[g.groups.get(2, [])]
Empty DataFrame
Columns: [a, b, c]
Index: []
它不像向get_group
提供默认值一样干净(可能他们应该在将来的版本中添加该功能),但它可以正常工作。
答案 2 :(得分:0)
您可以使用defaultdict
来实现。
假设您有一个groupby对象,该对象将大于零的列中的数据分割开。问题在于所有值都可能大于或小于零,这意味着您无法确定groupby中是否有1或2个数据帧。
g_df = df.groupby(df.some_column.gt(0))
然后有2种方法
df_dict = defaultdict(pd.DataFrame, {i:i_df for i,i_df in g_df} )
df_dict[True]
df_dict[False]
或者:
df_dict = defaultdict(list, g_df.groups)
df.loc[df_dict[True]]
df.loc[df_dict[False]]
我还没有测试哪种方法更有效,显然第二种方法只会在索引而不是数据帧上创建一个defaultdict-这样可能会更高效。