按分组逆序排序

8

我有一个pandas数据框,其中包含变量名称、每个变量的值以及count(显示该行的频率):

df = pd.DataFrame({'var':['A', 'B', 'C'], 'value':[10, 20, 30], 'count':[1,2,3]})

var  value  count
A    10     1
B    20     2
C    30     3

我想使用 count 来获取如下输出结果:
var  value
A    10
B    20
B    20
C    30
C    30
C    30

什么是最好的方法来做到这一点?

https://dev59.com/2VYN5IYBdhLWcg3wfoRj - Shijith
这个问题的内容如何与标题“反向分组”相关? - Binyamin Even
4个回答

7
你可以使用index.repeat:
i = df.index.repeat(df['count'])
d = df.loc[i, :'value'].reset_index(drop=True)

   var  value
0   A     10
1   B     20
2   B     20
3   C     30
4   C     30
5   C     30

3
使用repeatreindex可以实现这个简短的一行代码:
df.reindex(df.index.repeat(df['count']))

输出:

  var  value  count
0   A     10      1
1   B     20      2
1   B     20      2
2   C     30      3
2   C     30      3
2   C     30      3

或者删除“count”列:

df[['var','value']].reindex(df.index.repeat(df['count']))

或者

df.reindex(df.index.repeat(df['count'])).drop('count', axis=1)

输出:

  var  value
0   A     10
1   B     20
1   B     20
2   C     30
2   C     30
2   C     30

1
到目前为止,这实际上是最好的答案。它是唯一一个不需要知道其他列的标签的答案。 - Peaceful James
1
df.reindex(df.index.repeat(df['count'])).iloc[:,:-1].reset_index(drop=True) - Shijith

2
使用 Series.repeat
import pandas as pd
df = pd.DataFrame({'var':['A', 'B', 'C'], 'value':[10, 20, 30], 'count':[1,2,3]})
new_df = pd.DataFrame()

new_df['var'] = df['var'].repeat(df['count'])
new_df['value'] = df['value'].repeat(df['count'])
new_df

    var value
0   A   10
1   B   20
1   B   20
2   C   30
2   C   30
2   C   30

1

有许多方法可以实现这一点。以下是我喜欢做的一个机智的方法:

df.transform({
    "count": lambda x: [i for i in range(x)],
    "var": lambda x: x,
    "value": lambda x: x
}).explode("count").drop("count", axis=1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接