【问题标题】:Repeat rows in a pandas DataFrame based on column value根据列值在 pandas DataFrame 中重复行
【发布时间】:2017-11-16 18:25:27
【问题描述】:

我有以下df:

code . role    . persons
123 .  Janitor . 3
123 .  Analyst . 2
321 .  Vallet  . 2
321 .  Auditor . 5

第一行表示我有 3 个担任清洁工角色的人。 我的问题是我需要为每个人设置一条线路。我的 df 应该是这样的:

df:

code . role    . persons
123 .  Janitor . 3
123 .  Janitor . 3
123 .  Janitor . 3
123 .  Analyst . 2
123 .  Analyst . 2
321 .  Vallet  . 2
321 .  Vallet  . 2
321 .  Auditor . 5
321 .  Auditor . 5
321 .  Auditor . 5
321 .  Auditor . 5
321 .  Auditor . 5

我如何使用 pandas 来做到这一点?

【问题讨论】:

    标签: python pandas dataframe repeat


    【解决方案1】:

    reindex+ repeat

    df.reindex(df.index.repeat(df.persons))
    Out[951]: 
       code  .     role ..1  persons
    0   123  .  Janitor   .        3
    0   123  .  Janitor   .        3
    0   123  .  Janitor   .        3
    1   123  .  Analyst   .        2
    1   123  .  Analyst   .        2
    2   321  .   Vallet   .        2
    2   321  .   Vallet   .        2
    3   321  .  Auditor   .        5
    3   321  .  Auditor   .        5
    3   321  .  Auditor   .        5
    3   321  .  Auditor   .        5
    3   321  .  Auditor   .        5
    

    PS:可以加.reset_index(drop=True)获取新索引

    【讨论】:

    • 太棒了,我知道有一个很好的重复解决方案,但这成功了。
    • 是的,这很好。也许还有一个最终的 reset_index()?
    • @Wen 我喜欢学习新东西!您会相信,我不知道您可以在重新索引中重用索引值。我一直使用 reindex 来洗牌或添加索引,但从不复制,你在这里做过吗。美丽的。好东西。 +1
    • @ScottBoston 谢谢伙计 :-) 所以是个不错的地方,可以推动我们互相学习(我很久以前从coldspeed 学到的 :-))
    【解决方案2】:

    Wen 的解决方案非常好用且直观。这是另一种选择,在df.values 上调用repeat

    df
    
       code     role  persons
    0   123  Janitor        3
    1   123  Analyst        2
    2   321   Vallet        2
    3   321  Auditor        5
    
    
    pd.DataFrame(df.values.repeat(df.persons, axis=0), columns=df.columns)
    
       code     role persons
    0   123  Janitor       3
    1   123  Janitor       3
    2   123  Janitor       3
    3   123  Analyst       2
    4   123  Analyst       2
    5   321   Vallet       2
    6   321   Vallet       2
    7   321  Auditor       5
    8   321  Auditor       5
    9   321  Auditor       5
    10  321  Auditor       5
    11  321  Auditor       5
    

    【讨论】:

    • 在性能方面,.reindex().values.repeat() 哪个更好?
    • @lmiuelvargasf 这个解决方案更快。但是 Wen 的解决方案需要更少的字符,而且我很高兴在他的回答下留下了一个很好的评论,这激发了所有额外的支持。
    • 我在您的解决方案中看到的唯一问题是数据框中每一列的dtypes 都更改为object
    【解决方案3】:

    没有足够的声誉可以发表评论,但基于@cs95 的回答和@lmiuelvargasf 的评论,可以通过以下方式保留 dtypes:

    pd.DataFrame(
        df.values.repeat(df.persons, axis=0),
        columns=df.columns,
    ).astype(df.dtypes)
    

    【讨论】:

      猜你喜欢
      • 2016-05-05
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-19
      • 2022-01-14
      • 1970-01-01
      相关资源
      最近更新 更多