举个简单的例子,假设我在 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 个数据点,则行将堆叠。
如何设置列数,然后让数据均匀分布?
答案 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 |