Sil*_* He 6 python data-analysis pandas pandas-groupby
我有如下 DataFrame:
df = pd.DataFrame([
("i", 1, 'GlIrbixGsmCL'),
("i", 1, 'GlIrbixGsmCL'),
("i", 1, '3IMR1UteQA'),
("c", 1, 'GlIrbixGsmCL'),
("i", 2, 'GlIrbixGsmCL'),
], columns=['type', 'cid', 'userid'])
Run Code Online (Sandbox Code Playgroud)
更多细节:
i_counts, c_counts => df.groupby(["cid","type"]).size()
i_ucounts, c_ucounts => df.groupby(["cid","type"])["userid"].nunique()
i_frequency,u_frequency => df.groupby(["cid","type"])["userid"].value_counts()
Run Code Online (Sandbox Code Playgroud)
看起来对我来说有点复杂,如何使用pandas来获得预期的结果?
id_numbersfromuser_id并将其转换为int type.groupby和agg来评估count// ucount`频率。pivot重组表。reset_index如果需要,压平列。df['userid'] = df.userid.str.extract(r'(\d+)').astype(int)
k = df.groupby(["type", 'cid']).agg(count=('userid', 'count'), ucount=(
'userid', 'nunique'), frequency=('userid', lambda x: x.value_counts().to_dict())).reset_index()
k = k.pivot(index=[k.index, 'cid'], columns='type').fillna(0)
Run Code Online (Sandbox Code Playgroud)
count ucount frequency
type c i c i c i
cid
0 1 1.0 0.0 1.0 0.0 {1: 1} 0
1 1 0.0 3.0 0.0 2.0 0 {1: 2, 2: 1}
2 2 0.0 1.0 0.0 1.0 0 {1: 1}
Run Code Online (Sandbox Code Playgroud)
然后转换列:
k.columns = k.columns.map(lambda x: '_'.join(x[::-1]))
Run Code Online (Sandbox Code Playgroud)
输出:
c_count i_count c_ucount i_ucount c_frequency i_frequency
cid
0 1 1.0 0.0 1.0 0.0 {1: 1} 0
1 1 0.0 3.0 0.0 2.0 0 {1: 2, 2: 1}
2 2 0.0 1.0 0.0 1.0 0 {1: 1}
Run Code Online (Sandbox Code Playgroud)
k = df.groupby(["type" , 'cid']).agg(count = ('userid' ,'count') , ucount = ('userid', 'nunique') , frequency=('userid', lambda x: x.value_counts().to_dict())).reset_index()
k = k.pivot(index=['cid'], columns ='type').fillna(0)
Run Code Online (Sandbox Code Playgroud)
count ucount frequency
type c i c i c i
cid
1 1.0 3.0 1.0 2.0 {'userid001': 1} {'userid001': 2, 'userid002': 1}
2 0.0 1.0 0.0 1.0 0 {'userid001': 1}
Run Code Online (Sandbox Code Playgroud)
NOTE:如果需要,可用于df.userid = df.userid.factorize()[0]编码userid。
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |