不同分组的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']})
我需要获取与右侧类别字符串模式数相等的数据帧数,即 RGB
、CMYK
、G
。有没有办法 - 也许使用正则表达式 - 将这个字符串片段放在 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
- 关于regex pattern used
regex101
的详细信息
我有以下数据框:
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']})
我需要获取与右侧类别字符串模式数相等的数据帧数,即 RGB
、CMYK
、G
。有没有办法 - 也许使用正则表达式 - 将这个字符串片段放在 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
它不是
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
- 关于regex pattern used
regex101
的详细信息