Python 熊猫在2个给定数字、给定步长和groupby内插值
这是一个很难回答的问题,因为我可以找到每一个问题是如何单独完成的,但我想把它们放在一起,特别是由小组应用。目标是使用2个值作为范围,并在给定间隔的情况下在它们之间插值。接下来,我想要一个包含运行求和的列(不过,我对它很熟悉,在groupby中我不了解插值函数) 如上所述,我从一个基本的开始,它工作得非常完美,即:Python 熊猫在2个给定数字、给定步长和groupby内插值,python,pandas,interpolation,pandas-groupby,Python,Pandas,Interpolation,Pandas Groupby,这是一个很难回答的问题,因为我可以找到每一个问题是如何单独完成的,但我想把它们放在一起,特别是由小组应用。目标是使用2个值作为范围,并在给定间隔的情况下在它们之间插值。接下来,我想要一个包含运行求和的列(不过,我对它很熟悉,在groupby中我不了解插值函数) 如上所述,我从一个基本的开始,它工作得非常完美,即: df = pd.DataFrame({'minute':[1,3,4,5,8],'value':[1,4,7,10,13]}) max_value = df['minute'].max
df = pd.DataFrame({'minute':[1,3,4,5,8],'value':[1,4,7,10,13]})
max_value = df['minute'].max()
df.index = df.minute
df2 = pd.DataFrame({'minute':range(0,max_value), 'Value':0})
df2.index = df2.minute
df2.value = df.value
df2= df2.fillna(0)
但是现在给了一个附加的列,我如何将其应用于“id”'a'
和id
因此,考虑到这个数据框架:
df = pd.DataFrame([['a', '0', '10'],
['a', '1', '10'],
['h', '2', '15'],
['a', '1', '10'],
['h', '3', '20'],
['h', '13', '5']], columns = ['id','minute','value'])
我想生成这个输出,它将按id
列分组,按minute
列插值,其中min为0,max为该列中的max值,并在value列中输入0
示例输出:
id minute value sum
a 0 10 10
a 1 20 30
a 2 0 30
a 3 0 30
a 4 0 30
a 5 0 30
a 6 0 30
a 7 0 30
a 8 0 30
a 9 0 30
a 10 0 30
a 11 0 30
a 12 0 30
a 13 0 30
h 0 0 0
h 1 0 0
h 2 15 15
h 3 20 35
h 4 0 35
h 5 0 35
h 6 0 35
h 7 0 35
h 8 0 35
h 9 0 35
h 10 0 35
h 11 0 35
h 12 0 35
h 13 5 40
您可以尝试使用该方法创建一个
多索引
,然后使用它重新编制索引。然后使用groupby.cumsum
创建“sum”列:
min_idx = np.arange(df['minute'].max() + 1)
m_idx = pd.MultiIndex.from_product([df['id'].unique(), min_idx], names=['id', 'minute'])
df_new = df.set_index(['id', 'minute']).reindex(m_idx, fill_value=0).reset_index()
df_new['sum'] = df_new.groupby('id')['value'].cumsum()
df_new
[外]
我刚刚注意到我的数据有问题。由于“分钟”列以分钟为单位,因此有些行将具有相同的分钟和id,从而创建一个非唯一的多索引。我对上面的数据框进行了快速编辑以显示它。但是,由于我最初没有它,我接受这个答案,因为这是我的错误/失误,并且这个解决方案在OP中确实有效。Yeh可能只需要在转换之前重复删除原始数据帧。例如,
df.drop_duplicates(subset=['id','minute'],inplace=True)
?是的,但是如果我删除了重复项,那么它会删除重复项的值,我需要将这些值组合起来,这样这些值的总和就是一行。我现在正在做这件事。我只是好奇你是不是从头顶上就知道了。啊,我明白了,在这种情况下,可能是df=df.groupby(['id','minute']).sum().reset_index()
首先?是的,我在读这篇文章之前就这么做了。完美的谢谢你在这方面的额外帮助。我知道,在最初的解决方案之后,海报会窥探更多的帮助,这可能会很烦人,因此非常感谢扩展的帮助
id minute value sum
0 a 0 10 10
1 a 1 10 20
2 a 2 0 20
3 a 3 0 20
4 a 4 0 20
5 a 5 10 30
6 a 6 0 30
7 a 7 0 30
8 a 8 0 30
9 a 9 0 30
10 a 10 0 30
11 a 11 0 30
12 a 12 0 30
13 a 13 0 30
14 h 0 0 0
15 h 1 0 0
16 h 2 15 15
17 h 3 20 35
18 h 4 0 35
19 h 5 0 35
20 h 6 0 35
21 h 7 0 35
22 h 8 0 35
23 h 9 0 35
24 h 10 0 35
25 h 11 0 35
26 h 12 0 35
27 h 13 5 40