我有一系列的numpy数组,并想从中创建一个数据框列。具体来说,我有一个看起来像这样的数据框:
In [298]: df = pd.DataFrame({'name': ['A','A','B','B'], 'value': [1,2,3,4]})
In [299]: df
Out[299]:
name value
0 A 1
1 A 2
2 B 3
3 B 4
我现在像这样计算每个“名称”的累积积分:
In [300]: g = df.groupby('name')
In [301]: r = g.apply(lambda x: np.insert(integrate.cumtrapz(x.value), 0, [0]))
In [302]: r
Out[302]:
name
A [0.0, 1.5]
B [0.0, 3.5]
dtype: object
r的类型和r的元素是:
In [303]: type(r)
Out[303]: pandas.core.series.Series
In [304]: type(r[0])
Out[304]: numpy.ndarray
我想将此结果添加到原始数据框中,以实现:
In [308]: df['cumint'] = np.append(r[0], r[1])
In [309]: df
Out[309]:
name value cumint
0 A 1 0.0
1 A 2 1.5
2 B 3 0.0
3 B 4 3.5
达到此结果的最佳方法是什么。
答案 0 :(得分:2)
您的系列包含numpy数组,因此您可以concatenate将系列中的元素{{}}放入一个长numpy数组中,并将新列设置为此数组:
df['cumint'] = np.concatenate(r, axis=0)
结果:
>> print(df)
name value cumint
0 A 1 0.0
1 A 2 1.5
2 B 3 0.0
3 B 4 3.5
答案 1 :(得分:2)
您可以在此处使用transform
而不是apply
来获得一系列结果:
df['cumint']=(df.groupby('name')['value'].
transform(lambda x: np.insert(integrate.cumtrapz(x), 0, [0])))
#or df['cumint']= g['value'].transform(lambda x: np.insert(integrate.cumtrapz(x), 0, [0]))
print(df)
name value cumint
0 A 1 0.0
1 A 2 1.5
2 B 3 0.0
3 B 4 3.5