【问题标题】:Pandas. Splitting Data frame content continuously and evenly across multiple columns熊猫。在多列中连续均匀地拆分数据框内容
【发布时间】:2021-09-28 08:54:27
【问题描述】:

作为一个简单的例子,假设我在 pandas 中有以下数据框

the_content = {"Name" : ["John", "Kathy", "Kurtis", "Sharon"], 
              "Hobbies" : ["Fishing", "Sewing", "Skiing", "Biking"]}

当我创建一个数据框时:

panda_table = pd.DataFrame(the_content)

然后将其转换成html表格:

html_panda_table = panda_table.to_html()

结果由四行数据和两列组成。类似的东西

    Names    Hobbies
0   John     Fishing
1   Kathy    Sewing
2   Kurtis   Skiing
3   Sharon   Biking

但是,我想将相同的内容均匀地拆分到重复的行中。如果有大量数据,这样做的目的会变得更加明显。在这种情况下,我想设置一个值,比如 4 列。那么就只有一个数据行和 8 列。

   Names   Hobbies   Names     Hobbies   Names   Hobbies    Names   Hobbies
0  John    Fishing 1 Kathy     Sewing  2 Kurtis  Skiing  3 Sharon  Biking

如果有超过 4 个数据点,例如 6 个数据点或 50 个数据点,则行将堆叠。

如何设置列数,然后让数据均匀分布?

【问题讨论】:

    标签: python python-3.x pandas


    【解决方案1】:

    您可以在原始数据框的行中进行迭代,以构建微小的数据框并将它们保存在列表中。最后使用pd.concat(axis=1) 可以连接它们以获得预期的结果。

    编辑:根据您的评论,我已经更新了代码以根据max_size_row 变量在数据框中创建一个新行。这里的想法是根据行的长度将我们的df_list 切成块,然后使用pd.concat(axis=1) 创建完整的行并将其存储在df_list_row 中。当我们在df_list_row 中拥有所有行时,我们使pd.concat(axis=0)(这是默认值)。也许还有其他最好的方法,但我认为这是一个很好的答案。

    import numpy as np
    
    df_list = []
    df_list_row = []
    start = 0
    max_size_row = end = 4 
    
    for row in panda_table.to_numpy():
      df_list.append(pd.DataFrame(data=[row], columns=panda_table.columns))
    
    while start < len(df_list):
      df_row = df_list[start:end]
      if len(df_row) < max_size_row:
        df_row += [pd.DataFrame(data=[[np.nan, np.nan]], columns=panda_table.columns)]*(max_size_row - len(df_row))
      df_list_row.append(pd.concat(df_row, axis=1))
      start += max_size_row
      end += max_size_row
    
    df = pd.concat(df_list_row).reset_index(drop=True)
    

    使用max_size_row = 2输出

    Name Hobbies Name Hobbies
    John Fishing Kathy Sewing
    Kurtis Skiing Sharon Biking
    Carlos Writing NaN NaN

    使用max_size_row = 3输出

    Name Hobbies Name Hobbies Name Hobbies
    John Fishing Kathy Sewing Kurtis Skiing
    Sharon Biking Carlos Writing NaN NaN

    使用max_size_row = 4输出

    Name Hobbies Name Hobbies Name Hobbies Name Hobbies
    John Fishing Kathy Sewing Kurtis Skiing Sharon Biking
    Carlos Writing NaN NaN NaN NaN NaN NaN

    【讨论】:

    • 谢谢!但是,如果我添加第 5 项,我希望它在 John 下方创建另一行。在此解决方案中,它将保留一行并添加第 5 列而不是新行。怎么可能呢?在每 4 个元素之后,下一个元素应该开始一个新行。
    • @geekygeek 我已经更新了我的答案,请再次测试,如果此答案解决了您的问题,请将其标记为正确✔。这有助于其他人更容易找到答案并帮助我成长:)
    • 非常感谢。当然,我已标记为最佳答案。再次感谢。
    猜你喜欢
    • 2018-12-04
    • 2018-09-23
    • 2016-12-03
    • 1970-01-01
    • 2020-10-29
    • 2019-05-09
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    相关资源
    最近更新 更多