[下面的数据框,我想按人的名字分组,将每个月的销售额加入到每个人的列表中,然后再计算每个人的出现。
df = pd.DataFrame([["Mike","Mike","Mike","Kate","Kate","Zeb","Zeb","Philip","Philip","Herman",],
["A4","A2","A4","A5","A6","A2","A6","A4","A4","A6"],
["A6","A3","A3","A3","A3","A3","A6","A5","A5","A5"],
["A3","A4","A5","A4","A6","A4","A6","A6","A5","A2"],
["A3","A5","A5","A5","A5","A4","A2","A3","A5","A2"]]).T
df.columns = ["Name", "Jan", "Feb", "Mar", "Apr"]
我在下面尝试过,但没有一个更接近所需的内容:
df_1 = pd.crosstab([df['Name']],[df['Jan'],df['Feb'],df['Mar'],df['Apr']])
df_1 = df.groupby(['Name','Jan','Feb','Mar','Apr']).size()
df_1 = df.groupby(['Name'], as_index=False)['Jan','Feb','Mar','Apr'].agg(lambda x: list(x))
所需的输出类似于:
Mike: A3(4),A4(3),A5(2),A6(2),A2(1)
什么是正确的解决方法?
谢谢。
这是与建议使用@ C95的stack
等效的解决方案:
df = pd.DataFrame([["Mike","Mike","Mike","Kate","Kate","Zeb","Zeb","Philip","Philip","Herman",],
["A4","A2","A4","A5","A6","A2","A6","A4","A4","A6"],
["A6","A3","A3","A3","A3","A3","A6","A5","A5","A5"],
["A3","A4","A5","A4","A6","A4","A6","A6","A5","A2"],
["A3","A5","A5","A5","A5","A4","A2","A3","A5","A2"]]).T
df.columns = ["Name", "Jan", "Feb", "Mar", "Apr"]
df_1 = pd.melt(df, id_vars=['Name'], value_name='A', var_name='Count' )
df_1.groupby(['Name', 'A']).count().reset_index()
Name A Count
0 Herman A2 2
1 Herman A5 1
2 Herman A6 1
3 Kate A3 2
4 Kate A4 1
5 Kate A5 3
6 Kate A6 2
7 Mike A2 1
8 Mike A3 4
9 Mike A4 3
10 Mike A5 3
11 Mike A6 1
12 Philip A3 1
13 Philip A4 2
14 Philip A5 4
15 Philip A6 1
16 Zeb A2 2
17 Zeb A3 1
18 Zeb A4 2
19 Zeb A6 3