【问题标题】:How to create multiple columns in Pandas Dataframe?如何在 Pandas Dataframe 中创建多列?
【发布时间】:2022-11-27 19:00:13
【问题描述】:

我有您在终端中看到的数据。我需要将它转换为 Excel 工作表格式,正如您在 Excel 工作表文件中看到的那样,通过在列中创建多层次。

我对此进行了研究并达到了许多不同的目的但无法实现我的目标然后我达到了“转置”,它给了我我需要的形状但不幸的是它确实从一列重塑为一行而不是我得到错误的数据排序.

当前结果:

期望的结果:

接下来我可以尝试什么?

【问题讨论】:

  • 您的输入和期望的输出不匹配。例如 cel1 对于 palyer==2, 所有值都是 0 但是你想要的输出你输入 1, 3,1
  • 1,3,1 是这些列的值,而不是列或索引
  • 好的,解释一下为什么你有0, 11, 12?在palyer=10&cel=1
  • 好吧,也许我没有提到,对不起,0、11 和 12 是 cel1 列的值,第 10 号玩家通过这些值与此列 (cel1) 共享。我没有提到的是,我给出了 excel 表中不存在的值作为示例,但 excel 表和终端中的玩家编号相同
  • 不要发布代码图像、代码链接、数据、错误消息等 - 将文本复制或键入问题

标签: python pandas dataframe


【解决方案1】:

您可以使用pivot() 函数并重新排序多列级别。

在此之前,对重复迭代/轮次的索引/分组数据:

data=[
    (2,0,0,1),
    (10,2,5,3),
    (2,0,0,0),
    (10,1,1,1),
    (2,0,0,0),
    (10,1,2,1),
]

columns = ["player_number", "cel1", "cel2", "cel3"]

df = pd.DataFrame(data=data, columns=columns)

df_nbr_plr = df[["player_number"]].groupby("player_number").agg(cnt=("player_number","count"))
df["round"] = list(itertools.chain.from_iterable(itertools.repeat(x, df_nbr_plr.shape[0]) for x in range(df_nbr_plr.iloc[0,0])))

[Out]:
   player_number  cel1  cel2  cel3  round
0              2     0     0     1      0
1             10     2     5     3      0
2              2     0     0     0      1
3             10     1     1     1      1
4              2     0     0     0      2
5             10     1     2     1      2

现在,对列级别进行透视和重新排序:

df = df.pivot(index="round", columns="player_number").reorder_levels([1,0], axis=1).sort_index(axis=1)

[Out]:
player_number   2              10          
              cel1 cel2 cel3 cel1 cel2 cel3
round                                      
0                0    0    1    2    5    3
1                0    0    0    1    1    1
2                0    0    0    1    2    1

【讨论】:

  • 是的,实际上当我使用上面的答案时,当我创建一个新的玩家号码时,我丢失了一些数据,但是每当我更改我的数据时,这个答案都是正确的,没有副作用
  • 你能告诉我这里使用了什么 itertools 吗?
  • itertools.repeat() 将 0,1,2 重复为 [0,0] [1,1][2,2] 以进行玩家回合/迭代(您已重复 2,10,2,10,...)。 chain.from_iterable() 按顺序加入它们,使列“圆形”。
【解决方案2】:

这可以在将 player__number 设置为索引后使用 unstack 完成。您必须重新排序 Multiindex 列并填充缺失值/删除重复项:

import pandas as pd

data = {"player__number": [2, 10 , 2, 10, 2, 10],
        "cel1": [0, 2, 0, 1, 0, 1],
        "cel2": [0, 5, 0, 1, 0, 2],
        "cel3": [1, 3, 0, 1, 0, 1],
}

df = pd.DataFrame(data).set_index('player__number', append=True)
df = df.unstack('player__number').reorder_levels([1, 0], axis=1).sort_index(axis=1) # unstacking, reordering and sorting columns
df = df.ffill().iloc[1::2].reset_index(drop=True) # filling values and keeping only every two rows
df.to_excel('output.xlsx')

输出:

【讨论】:

  • 如果可以,请使用文本输出来提问。图像不适用于屏幕阅读器、剪贴板或搜索引擎机器人。上面的图像可以呈现为预格式化的表格,或者更好的是,Markdown 表格。请参阅 Azhar 对前者的回答。
猜你喜欢
  • 2021-03-04
  • 2022-01-23
  • 2017-12-09
  • 1970-01-01
  • 2020-03-18
  • 2019-08-31
  • 1970-01-01
  • 2018-08-21
相关资源
最近更新 更多