Pandas插值按组添加行,每组具有不同的范围



我正试图将行添加到DataFrame中,逐组插入列中的值,并填充缺失的所有其他列。我的数据看起来像这样:

import pandas as pd 
import random
random.seed(42)
data = {'group':['a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c' ],
'value' : [1, 2, 5,  3, 4, 5, 7, 4, 7, 9],
'other': random.sample(range(1, 100), 10)}
df = pd.DataFrame(data)
print(df)
group  value  other
0     a      1     82
1     a      2     15
2     a      5      4
3     b      3     95
4     b      4     36
5     b      5     32
6     b      7     29
7     c      4     18
8     c      7     14
9     c      9     87

我试图实现的是这样的目标:

group  value  other
a      1     82
a      2     15
a      3     NaN
a      4     NaN
a      5     NaN
b      3     95
b      4     36
b      5     32
b      6     NaN
b      7     29
c      4     18
c      5     NaN
c      6     NaN
c      7     14
c      8     NaN
c      9     87

例如,组a具有从1到5的范围,b具有从3到7的范围,并且c具有从4到9的范围。

我遇到的问题是,每个小组都有不同的范围。我发现了一种假设所有组都有一个范围的方法。这可以使用全局最小值和最大值,并在每个组中删除额外的行,但由于我的数据相当大,因此在每个组添加许多行很快变得不可行。

>>> df.groupby('group').apply(lambda x: x.set_index('value').reindex(np.arange(x['value'].min(), x['value'].max() + 1))).drop(columns='group').reset_index()
group  value  other
0      a      1   82.0
1      a      2   15.0
2      a      3    NaN
3      a      4    NaN
4      a      5    4.0
5      b      3   95.0
6      b      4   36.0
7      b      5   32.0
8      b      6    NaN
9      b      7   29.0
10     c      4   18.0
11     c      5    NaN
12     c      6    NaN
13     c      7   14.0
14     c      8    NaN
15     c      9   87.0

我们在group列上分组,然后用value列的最小值到最大值的范围重新索引每组

一个选项是pyjanitor的完整函数,它有助于公开显式缺失的行(也有助于抽象重塑过程(:

# pip install pyjanitor
import pandas as pd
import janitor
new_value = {'value' : lambda df: range(df.min(), df.max()+1)}
# expose the missing values per group via the `by` parameter
df.complete(new_value, by='group', sort = True)
group  value  other
0      a      1   82.0
1      a      2   15.0
2      a      3    NaN
3      a      4    NaN
4      a      5    4.0
5      b      3   95.0
6      b      4   36.0
7      b      5   32.0
8      b      6    NaN
9      b      7   29.0
10     c      4   18.0
11     c      5    NaN
12     c      6    NaN
13     c      7   14.0
14     c      8    NaN
15     c      9   87.0

最新更新