我正在嘗試將行添加到 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。
我遇到的問題是每個組都有不同的范圍。我發現了一些假設所有組都有一個范圍的東西。這可以使用全域最小值和最大值并在每個組中洗掉額外的行,但是由于我的資料相當大,因此為每個組添加許多行很快變得不可行。
uj5u.com熱心網友回復:
>>> 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列
uj5u.com熱心網友回復:
一種選擇是使用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
對于這樣的操作,Groupby 有時會很慢;如果您的資料很大,則更快的方法是在公開丟失的行之前預先計算資料。如果速度是一個問題,請提及(永遠不要倉促優化:))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/381279.html
標籤:Python 熊猫 数据框 pandas-groupby 插值
