【问题标题】:Splitting Pandas dataframe into multiple mini-dataframes将 Pandas 数据帧拆分为多个迷你数据帧
【发布时间】:2021-08-14 20:18:06
【问题描述】:

这是我正在处理的程序的第二部分。我有一个熊猫数据框,其中包括: Title|df1_data1|df1_data2|df1_data3|df1_data4|df2_data1|df2_data2|df2_data3|df2_data4|df3_data1|df3_data2|df3_data3|df3_data4

但有两条规则:

  1. df 并不总是包含 3 个文件(df1df2df3),可能或多或少。
  2. 每个文件总是有 4 条数据。

我已经编写了代码的下一步,但输入需要这个更大的多个迷你数据帧。

因此,对于这个三个文件的示例,我需要将数据框拆分为

 1. |Title|df1_data1|df1_data2|df1_data3|df1_data4|
 2. |Title|df2_data1|df2_data2|df2_data3|df2_data4|
 3. |Title|df3_data1|df3_data2|df3_data3|df3_data4|

我目前正在尝试解决这个问题,我正在尝试遍历标题和每四个标题(不包括标题)我创建一个数据框... idk ima 继续尝试 PLS HELP

这是大数据框记住规则

thisdict = {'Title': ['aaarrr','hahahamhm','yaaahooo','yaahoo', 'oopsymhm', 'ayorrr'],
        'df1_data1': ['324','123','444','NOTHING', 'NOTHING', 'NOTHING'],
        'df1_data2': ['4314','4321','7658','NOTHING', 'NOTHING', 'NOTHING'],
        'df1_data3': ['342','111','235','NOTHING', 'NOTHING', 'NOTHING'],
        'df1_data4': ['325','542','523','NOTHING', 'NOTHING', 'NOTHING'],
        'df2_data1': ['1','NOTHING','NOTHING','4', '3', 'NOTHING'],
        'df2_data2': ['2','NOTHING','NOTHING','3', '2', 'NOTHING'],
        'df2_data3': ['3','NOTHING','NOTHING','2', '4', 'NOTHING'],
        'df2_data4': ['4','NOTHING','NOTHING','1', '1', 'NOTHING'],
        'df3_data1': ['NOTHING','NOTHING','NOTHING','2', '67', '4'],
        'df3_data2': ['NOTHING','NOTHING','NOTHING','73', '2', '7'],
        'df3_data3': ['NOTHING','NOTHING','NOTHING','2', '4', '5'],
        'df3_data4': ['NOTHING', 'NOTHING', 'NOTHING', '1', '0', '9']
        }

dataframe = pd.DataFrame(thisdict)

【问题讨论】:

    标签: python pandas dataframe loops split


    【解决方案1】:

    您可以附加Title 作为索引(以防Title 重复值)。然后,根据总列的长度创建列分割段的字典。

    df2 = dataframe.set_index('Title', append=True)   # append for just in case duplicate values of Title
    
    df_s = {(i+1): df2.iloc[:, i*4: i*4+4].reset_index(level=-1) for i in range(len(df2.columns) // 4)}
    

    然后,您可以通过df_s[i] 的语法访问各个拆分数据帧,例如

    print(df_s[1])
    
           Title df1_data1 df1_data2 df1_data3 df1_data4
    0     aaarrr       324      4314       342       325
    1  hahahamhm       123      4321       111       542
    2   yaaahooo       444      7658       235       523
    3     yaahoo   NOTHING   NOTHING   NOTHING   NOTHING
    4   oopsymhm   NOTHING   NOTHING   NOTHING   NOTHING
    5     ayorrr   NOTHING   NOTHING   NOTHING   NOTHING
    
    
    print(df_s[2])
    
           Title df2_data1 df2_data2 df2_data3 df2_data4
    0     aaarrr         1         2         3         4
    1  hahahamhm   NOTHING   NOTHING   NOTHING   NOTHING
    2   yaaahooo   NOTHING   NOTHING   NOTHING   NOTHING
    3     yaahoo         4         3         2         1
    4   oopsymhm         3         2         4         1
    5     ayorrr   NOTHING   NOTHING   NOTHING   NOTHING
    
    print(df_s[3])
    
           Title df3_data1 df3_data2 df3_data3 df3_data4
    0     aaarrr   NOTHING   NOTHING   NOTHING   NOTHING
    1  hahahamhm   NOTHING   NOTHING   NOTHING   NOTHING
    2   yaaahooo   NOTHING   NOTHING   NOTHING   NOTHING
    3     yaahoo         2        73         2         1
    4   oopsymhm        67         2         4         0
    5     ayorrr         4         7         5         9
    
    

    【讨论】:

    • 快速提问你在 For 循环中所做的“//”是什么?
    • @Mteyra 是的,这是总是产生整数的除法。由于您可以拥有可变数量的 4 列段(文件),因此我们无法硬编码段(文件)的数量,而必须通过总列数(Title 列旁边)来计算它。
    • 哦,我知道我不知道这是可能的,我总是必须想办法解决这个问题,.reset_index 中的“级别”是什么?
    • @Mteyra 我深深地认为你的Title 列可能有重复,我们不能简单地将Title 设置为索引(否则会给出重复索引)。因此,我们附加索引。这将创建一个 2 级行索引(1 是原始范围索引 0、1、2、...5,另一个是 Title 列现在作为索引)。然后,当我们想将这个二级索引Title从索引恢复到数据列时,我们需要在reset_index命令中指定我们只想重置这个二级索引(-1表示最后一级,即第 2 位)。
    • 我什至没有想到重复 ?‍♂️ 非常感谢 mate 希望以后能多和你聊天。我希望我能为你投票,但没有声望哈哈
    【解决方案2】:

    您可以将标题设置为索引并使用过滤器获取列:

    df = df.set_index('Title')
    dfs = {'df%s' % i: df.filter(like='df%s' % i).reset_index()
           for i in range (1, 3+1)}
    

    【讨论】:

    • 我一直无法理解 % 的作用有没有简单的解释?
    猜你喜欢
    • 2019-05-31
    • 2018-05-05
    • 2023-02-05
    • 2013-11-16
    相关资源
    最近更新 更多