【问题标题】:Pandas & python: split dataframe into many dataframes based on column value containing substringPandas & python:根据包含子字符串的列值将数据帧拆分为多个数据帧
【发布时间】:2018-02-14 19:19:41
【问题描述】:

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

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

【问题讨论】:

  • 您建议的拆分规则是什么?名称(减去任何整数)?
  • 是的,准确地说,命名减号和尾随整数。不过我不知道名字提前,但它们总是字母,最后可能包含一个整数。

标签: python pandas


【解决方案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 获取名称的所有可能值:

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 包含拆分的数据帧

【讨论】:

    【解决方案2】:

    这行得通。请注意,我的字典键是名称,因为这看起来最合乎逻辑。

    # 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}
    

    【讨论】:

      【解决方案3】:

      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]
      

      【讨论】:

        猜你喜欢
        • 2018-05-05
        • 2021-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-24
        • 1970-01-01
        • 2019-05-31
        • 1970-01-01
        相关资源
        最近更新 更多