我有这样的dataframe - 每个交易可能会出现多个,而且交易链接到商店。我想找到交易的平均价值。为此我需要求和,然后求平均值:
#preparind dataset
txt_data = pandas.read_csv("./TestDataSource/txn.csv", sep = ';')
txt_data = txt_data.replace({',': '.'}, regex=True)
txt_data[['SALES']] = txt_data[[ 'SALES']].apply(pd.to_numeric)
我们len(txt_data.STORE.unique())
只有30个独特的商店。
首先,我汇总了交易:
a1 = txt_data[['STORE', 'SALES', 'TXN']].groupby('TXN').sum()[['STORE', 'SALES']]
a.head()
一切似乎都没问题。但后来我在商店聚合:
a2 = a1.groupby('STORE').mean()
[![enter image description here][3]][3]
但是...
list(a2.shape)
- 返回[1137,1]。多数民众赞成在困惑。但此外len(a1.STORE.unique())
返回1137
我做错了什么
答案 0 :(得分:4)
根据STORE
列的SALES
汇总sum
和TXN
列存在问题:
a1 = txt_data[['STORE', 'SALES', 'TXN']].groupby('TXN').sum()[['STORE', 'SALES']]
与...相同:
a1 = txt_data.groupby('TXN')['STORE', 'SALES'].sum()
但是,如果按列TXT
和STORE
进行汇总,那么效果很好:
txt_data = pd.read_csv("txn.csv", sep = ';', decimal=',')
a1 = txt_data.groupby(['TXN', 'STORE'], as_index=False)['SALES'].sum()
print (txt_data.STORE.nunique())
30
print (a1.STORE.nunique())
30
答案 1 :(得分:1)
在第
行a1 = txt_data[['STORE', 'SALES', 'TXN']].groupby('TXN').sum()[['STORE', 'SALES']]
您要按TXN
对数据框进行分组,但要告诉pandas将所有其他列相加,这样就可以得到store-id的总和以及"创建的新商店",例如:
txt_data[txt_data['TXN']==5541359000]
DAY STORE ART TXN TIME SALES
1268877 2015-10-01 1082 15294488 5541359000 09:30:22 60.2
1269093 2015-10-01 1082 80439 5541359000 09:30:29 15.6
1269309 2015-10-01 1082 191452 5541359000 09:30:15 4.0
1269525 2015-10-01 1082 15317962 5541359000 09:30:17 103.0
a1.head()
STORE SALES
TXN
5541359000 4328 182.8
#1082 * 4 = 4328
答案 2 :(得分:1)
我认为您使用此行时会发生问题,
a1 = txt_data[['STORE', 'SALES', 'TXN']].groupby('TXN').sum()
当我使用txt_data获得唯一值时[' STORE']。unique()输出,
array([22691, 20581, 1574, 1602, 1579, 29245, 19009, 21761, 17474,
1544, 1612, 1534, 958, 17096, 1094, 1596, 1594, 1609,
24605, 956, 961, 1122, 27220, 974, 1082, 25039, 1530,
999, 1053, 980])
但是在a1 Dataframe中, 存储值与txt_data不同,因为在STORE中group_by.sum()求和值以获得唯一的TXN' s。
请参阅:txt_data中没有STORE = 4328 [' STORE']。unique()
1082 * 4 = 4328