熊猫。跨多列连续均匀地拆分数据框内容

时间:2021-07-20 21:48:24

标签: python python-3.x pandas

举个简单的例子,假设我在 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 个数据点,则行将堆叠。

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

1 个答案:

答案 0 :(得分: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 输出:

<头>
姓名 爱好 姓名 爱好
约翰 钓鱼 凯西 缝纫
库蒂斯 滑雪 莎伦 骑自行车
卡洛斯 写作 NaN NaN

使用 max_size_row = 3 输出:

<头>
姓名 爱好 姓名 爱好 姓名 爱好
约翰 钓鱼 凯西 缝纫 库蒂斯 滑雪
莎伦 骑自行车 卡洛斯 写作 NaN NaN

输出 max_size_row = 4

<头>
姓名 爱好 姓名 爱好 姓名 爱好 姓名 爱好
约翰 钓鱼 凯西 缝纫 库蒂斯 滑雪 莎伦 骑自行车
卡洛斯 写作 NaN NaN NaN NaN NaN NaN