对字典追加元素以及分组聚合
描述:有两列,按照其中的一列分组,对另一列统计,转为list形式
#自定义数据
x1=np.random.randint(10,size=(20,1))
x2=np.random.randint(10,size=(20,1))
y=np.random.random(size=(20,1))
a=pd.DataFrame(np.c_[x1,x2,y],columns=['did_x','didx_2','dis'])
a.did_x=a.did_x.astype(int)
a.didx_2=a.didx_2.astype(int)
a
第一种:分组聚合方式
#分组聚合方式
a.groupby(['did_x']).agg({'didx_2':list}).reset_index()
第二种:形成字典方式
往往字典在实际中能解决很多问题,而且很灵活,我们重点掌握字典的一些用法
-------------------------------------------------------------------------------
setdefault接受一个键和一个默认值,并返回关联值,如果没有当前值,则返回默认值。
在本例中,我们将获得一个空的或已填充的列表,然后将当前值追加到该列表中。
#第一种方式
dic={}
for x in range(len(a)):
dic.setdefault(a.iloc[x,0],[]).append(a.iloc[x,1])
输出:
#字典转为Series然后转为DF 就能得到结果
pd.Series(dic).to_frame().reset_index().rename(columns={'index':'did_x',0:'didx_2'})
-------------------------------------------------------------------------------
#第二种方式
#先将dataframe两列数据转为list
data=a[['did_x','didx_2']].values.tolist()
from collections import defaultdict
ss=defaultdict(list)#defaultdict(list, {})
for i,j in data:
ss[i].append(j)
输出:
-------------------------------------------------------------------------------
# 第三种方式
dict1={}
for i ,j in data:
try:
dict1[i].append(j)
except KeyError:
dict1[i]=[j]
## 第四种方式 not in
dict2={}
for x in data:
key=x[0]
if key not in dict2:
dict2[key]=[]
dict2[key].append(x[1])