根据列值在pandas DataFrame中重复行

时间:2017-11-16 18:25:27

标签: python pandas dataframe repeat

我有以下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

我怎么能用熊猫做到这一点?

3 个答案:

答案 0 :(得分:17)

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)来获取新索引

答案 1 :(得分:6)

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

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

答案 2 :(得分:0)

没有足够的声誉进行评论,但是基于@ cs95的答案和@lmiguelvargasf的评论,人们可以使用以下方式保留dtype:

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