【发布时间】:2019-07-16 21:39:50
【问题描述】:
我正在 Pandas DataFrame 的子集上创建一个计数函数,并打算导出仅包含 groupby 标准和计数结果的字典/电子表格数据。
In [1]: df = pd.DataFrame([[Buy, A, 123, NEW, 500, 20190101-09:00:00am], [Buy, A, 124, CXL, 500, 20190101-09:00:01am], [Buy, A, 125, NEW, 500, 20190101-09:00:03am], [Buy, A, 126, REPLACE, 300, 20190101-09:00:10am], [Buy, B, 210, NEW, 1000, 20190101-09:10:00am], [Sell, B, 345, NEW, 200, 20190101-09:00:00am], [Sell, C, 412, NEW, 100, 20190101-09:00:00am], [Sell, C, 413, NEW, 200, 20190101-09:01:00am], [Sell, C, 414, CXL, 50, 20190101-09:02:00am]], columns=['side', 'sender', 'id', 'type', ''quantity', 'receive_time'])
Out[1]:
side sender id type quantity receive_time
0 Buy A 123 NEW 500 20190101-09:00:00am
1 Buy A 124 CXL 500 20190101-09:00:01am
2 Buy A 125 NEW 500 20190101-09:00:03am
3 Buy A 126 REPLACE 300 20190101-09:00:10am
4 Buy B 210 NEW 1000 20190101-09:10:00am
5 Buy B 345 NEW 200 20190101-09:00:00am
6 Sell C 412 NEW 100 20190101-09:00:00am
7 Sell C 413 NEW 200 20190101-09:01:00am
8 Sell C 414 CXL 50 20190101-09:02:00am
count函数如下(mydf作为dataframe的子集传入):
def ordercount(mydf):
num = 0.0
if mydf.type == 'NEW':
num = num + mydf.qty
elif mydf.type == 'REPLACE':
num = mydf.qty
elif mydf.type == 'CXL':
num = num - mydf.qty
else:
pass
orderdict = dict.fromkeys([mydf.side, mydf.sender, mydf.id], num)
return orderdict
从 csv 读取数据后,我按一些标准对其进行分组并按时间排序:
df = pd.read_csv('xxxxxxxxx.csv, sep='|', header=0, engine='python', names=col_names)
sorted_df = df.groupby(['side', 'sender', 'id']).apply(lambda_df:_df.sort_values(by=['time']))
然后在排序后的数据上调用之前定义的函数:
print(sorted_df.agg(ordercount))
但是值错误不断出现,说太多行无法调用。
统计数据的函数方式可能效率不高,但它是我能想到的最直接的方式来匹配订单类型和相应的统计数量。我希望程序输出一个表,其中只显示边、发件人、ID 和计数的数量。有没有办法实现这一目标?谢谢。
预期输出:
side sender total_order_num trade_date
0 Buy A 300 20190101
1 Buy B 1200 20190101
2 Sell C 250 20190101
【问题讨论】:
-
似乎您只需要在多列上对数据框进行排序。
df.sort_values(['side', 'sender', 'id', 'time']) -
我不认为问题出在排序上,而是不能在子集上调用函数
-
df.groupby(['side','sender','id']).apply(ordercount)? -
最好向这个问题添加一个小数据集和预期输出以获得更好的帮助。见this post
-
sorted_df = df.groupby(['side', 'sender', 'id'])['time'].apply(lambda df:df.sort_values())
标签: python pandas function dataframe pandas-groupby