不同分组的groupby匹配模式

Groupby matching pattern of different groups

我有以下数据框:

df = pd.DataFrame({'ID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], 
                   'Info': ['info1', 'info2', 'info3', 'info4', 'info5', 'info6', 
                            'info7', 'info8', 'info9', 'info10', 'info11', 'info12'],
                   'Category': ['157/120/RGB', '112/54/RGB', '14/280/CMYK', '50/100/RGB',
                                '150/88/CMYK', '160/100/G', '200/450/CMYK', '65/90/RGB',
                                '111/111/G', '244/250/RGB', '100/100/CMYK', '144/100/G']})

我需要获取与右侧类别字符串模式数相等的数据帧数,即 RGBCMYKG。有没有办法 - 也许使用正则表达式 - 将这个字符串片段放在 getgroup 方法中以创建这些组?例如:

df_RGB = df.groupby('Category').getgroup('...RGB')

我应该用什么替换点?

您可以使用 Series.str.split with df.groupby:

In [3747]: df['actual_category'] = df.Category.str.split('/').str[-1]

In [3765]: d = {k:v.iloc[:, :-1] for k,v in df.groupby('actual_category')}

In [3766]: d
Out[3766]: 
{'CMYK':     ID    Info      Category
 2    3   info3   14/280/CMYK
 4    5   info5   150/88/CMYK
 6    7   info7  200/450/CMYK
 10  11  info11  100/100/CMYK,
 'G':     ID    Info   Category
 5    6   info6  160/100/G
 8    9   info9  111/111/G
 11  12  info12  144/100/G,
 'RGB':    ID    Info     Category
 0   1   info1  157/120/RGB
 1   2   info2   112/54/RGB
 3   4   info4   50/100/RGB
 7   8   info8    65/90/RGB
 9  10  info10  244/250/RGB}

这将为您提供一个 dict,键作为 Category 名称,值作为每个类别的单独数据帧。

In [3753]: df_RGB = d['RGB']

In [3754]: df_RGB
Out[3754]: 
   ID    Info     Category
0   1   info1  157/120/RGB
1   2   info2   112/54/RGB
3   4   info4   50/100/RGB
7   8   info8    65/90/RGB
9  10  info10  244/250/RGB

您可以创建 Dataframes 字典,方法是将 groupby 对象转换为 dict,并按最后一个值分组 /:

d = dict(iter(df.groupby(df['Category'].str.split('/').str[-1])))
print (d)
{'CMYK':     ID    Info      Category
2    3   info3   14/280/CMYK
4    5   info5   150/88/CMYK
6    7   info7  200/450/CMYK
10  11  info11  100/100/CMYK, 'G':     ID    Info   Category
5    6   info6  160/100/G
8    9   info9  111/111/G
11  12  info12  144/100/G, 'RGB':    ID    Info     Category
0   1   info1  157/120/RGB
1   2   info2   112/54/RGB
3   4   info4   50/100/RGB
7   8   info8    65/90/RGB
9  10  info10  244/250/RGB}

print (d['CMYK'])
    ID    Info      Category
2    3   info3   14/280/CMYK
4    5   info5   150/88/CMYK
6    7   info7  200/450/CMYK
10  11  info11  100/100/CMYK

它不是 ,但可以按组名称创建 DataFrame,例如:

for i, g in df.groupby(df['Category'].str.split('/').str[-1]):
    globals()['df_' + str(i)] =  g

print (df_CMYK)

    ID    Info      Category
2    3   info3   14/280/CMYK
4    5   info5   150/88/CMYK
6    7   info7  200/450/CMYK
10  11  info11  100/100/CMYK

您可以在此处使用 GroupBy.get_group 进行尝试。

g = df['Category'].str.extract("/*(\w+)$").squeeze()
keys = g.unique() # if you want to see all the keys
grouped = df.groupby(g)

df_RGB = grouped.get_group('RGB')

   ID    Info     Category
0   1   info1  157/120/RGB
1   2   info2   112/54/RGB
3   4   info4   50/100/RGB
7   8   info8    65/90/RGB
9  10  info10  244/250/RGB