熊猫& python:根据包含子字符串的列值将数据帧拆分为多个数据帧

时间:2018-02-14 19:19:42

标签: python pandas

我的数据框可能有数百万行,如下所示:

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

3 个答案:

答案 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]