我已经搜索了很多次了,但是我无法理解这个问题:
我有一个熊猫的数据图,看起来是这样的:
date ticker Name NoShares SharePrice Volume Relation
2/1/10 aaa zzz 1 1 1 d
2/1/10 aaa yyy 1 2 5 o
2/1/10 aaa zzz 2 5 2 d
2/5/10 bbb xxx 5 5 1 do
2/5/10 ccc www 5 5 1 d
2/5/10 ccc www 5 5 1 d
2/5/10 ddd vvv 5 5 1 o
2/6/10 aaa zzz 1 1 3 d要求
所以我的输出应该是这样的:
date ticker Name NoShares SharePrice Volume Relation
2/1/10 aaa zzz 3 3.6 1 d
2/1/10 aaa yyy 1 2 5 o
2/5/10 bbb xxx 5 5 1 do
2/5/10 ccc www 10 5 1 d
2/5/10 ddd vvv 5 5 1 o
2/6/10 aaa zzz 1 1 3 d我尝试了堆栈溢出的文档和其他答案,但似乎无法正确处理。感谢你的帮助。干杯。
发布于 2018-06-21 20:08:25
这是我的解决方案:
grpby = df.groupby(['date','Name'])
a = grpby.apply(lambda x: np.average(a = x['SharePrice'],weights=x['NoShares'])).to_frame(name='SharePrice')
b = grpby.agg({'NoShares':'sum','Volume':'mean','Relation':'max'})
print b.join(a)
Volume Relation NoShares SharePrice
date Name
2/1/10 yyy 5.0000 o 1 2.0000
zzz 1.5000 d 3 3.6667
2/5/10 vvv 1.0000 o 5 5.0000
www 1.0000 d 10 5.0000
xxx 1.0000 do 5 5.0000
2/6/10 zzz 3.0000 d 1 1.0000之后只有reset_index()。
发布于 2018-06-21 20:10:19
我在这里做了个假设。当你说组的日期和名称,并保持关系-我假设,滴答和关系也将是独特的,这些组。因此,为了简单起见,我将所有4项进行分组。
df = pd.DataFrame([
['2/1/10', 'aaa', 'zzz', 1, 1, 1, 'd'],
['2/1/10', 'aaa', 'yyy', 1, 2, 5, 'o'],
['2/1/10', 'aaa', 'zzz', 2, 5, 2, 'd'],
['2/5/10', 'bbb', 'xxx', 5, 5, 1, 'do'],
['2/5/10', 'ccc', 'www', 5, 5, 1, 'd'],
['2/5/10', 'ccc', 'www', 5, 5, 1, 'd'],
['2/5/10', 'ddd', 'vvv', 5, 5, 1, 'o'],
['2/6/10', 'aaa', 'zzz', 1, 1, 3, 'd']],
columns = ['date', 'ticker', 'Name', 'NoShares',
'SharePrice', 'Volume', 'Relation'])
def process_date(dg):
return pd.DataFrame([[
dg['NoShares'].sum(),
(dg['NoShares'] * dg['SharePrice']).sum() / dg['NoShares'].sum(),
dg['Volume'].mean(),
]], columns=['NoShares', 'SharePrice', 'Volume'])
df.groupby(['date', 'ticker', 'Name', 'Relation']).apply(process_date).reset_index(4, drop=True).reset_index(drop=False)结果:
date ticker Name Relation NoShares SharePrice Volume
0 2/1/10 aaa yyy o 1 2.000000 5.0
1 2/1/10 aaa zzz d 3 3.666667 1.5
2 2/5/10 bbb xxx do 5 5.000000 1.0
3 2/5/10 ccc www d 10 5.000000 1.0
4 2/5/10 ddd vvv o 5 5.000000 1.0
5 2/6/10 aaa zzz d 1 1.000000 3.0发布于 2022-01-19 13:28:36
Dickster和Leo的答案都很好,但请注意,默认情况下,.groupby有dropna=True设置。因此,如果您有一个数据集,并在多个列上执行groupby,其中一些列可能包含NaN's,那么Pandas将删除这些组。最后的DataFrame将有较少的行。
Server上的相同SQL查询不会在group子句中的列中删除带空值的行。我不知道其他关系数据库管理系统是否如此,但请记住,在默认情况下,Pandas以不同的方式对待group by。
https://stackoverflow.com/questions/50976297
复制相似问题