我的数据框可能有数百万行,如下所示:
df:
name value
1 bob1 abc
2 bob3 def
3 jake2 ghi
4 jake jkl
5 sam1 mno
6 bob5 pqr
如何根据包含某些子字符串的名称列值将其拆分为多个数据框,例如本例中的“bob”,“jake”和“sam”?
如果这会改变任何内容,新的数据帧仍然可以保存在一个数据结构中,例如字典。
所需的数据框:
df1:
name value
1 bob1 abc
2 bob3 def
3 bob5 pqr
df2:
name value
1 jake2 ghi
2 jake jkl
df3:
name value
1 sam1 mno
答案 0 :(得分:1)
这是另一种方法:
获取所有不同的值:
def matching_function(x):
match = re.match(r"([a-z]+)([0-9]+)", x, re.I)
if match:
return match.group(1)
该函数从字符串thanks for this answer中删除mumber 获取所有可能的名称值:
set(df.name.apply(matching_function))
循环到这些值并拆分df:
df_list= []
for x in set(df.name.apply(matching_function)):
if x :
df_list.append(df.loc[df.name.apply(lambda y : y.startswith( x ))])
df_list包含已拆分的数据帧
答案 1 :(得分:0)
这很有效。请注意我的字典键是名称,因为这似乎是最符合逻辑的。
# get set of names
names = set(df.name.str.replace('\d+', ''))
# make dictionary
dfs = {n: df[df.name.str.replace('\d+', '') == n] for n in names}
# {'jake': name value
# 3 jake2 ghi
# 4 jake jkl,
# 'bob': name value
# 1 bob1 abc
# 2 bob3 def
# 6 bob5 pqr,
# 'sam': name value
# 5 sam1 mno}
答案 2 :(得分:0)
IIUC
l=[y for _,y in df.groupby(df.name.str.replace('\d+', ''))]
Out[207]:
l
[ name value
1 bob1 abc
2 bob3 def
6 bob5 pqr, name value
3 jake2 ghi
4 jake jkl, name value
5 sam1 mno]