Python 透视数据帧以查看是否满足条件
我有以下数据框,表示某个用户是否在某个星期、某个年份出现:Python 透视数据帧以查看是否满足条件,python,pandas,Python,Pandas,我有以下数据框,表示某个用户是否在某个星期、某个年份出现: User Year Week 0 John 2020 1 1 John 2020 2 2 Steve 2020 1 3 Fred 2020 3 4 George 2020 2 5 George 2020 3 ... ... ... 200 John 2021 2 201 John 20
User Year Week
0 John 2020 1
1 John 2020 2
2 Steve 2020 1
3 Fred 2020 3
4 George 2020 2
5 George 2020 3
... ... ...
200 John 2021 2
201 John 2021 4
202 Steve 2021 2
203 Fred 2021 2
204 George 2021 1
205 George 2021 4
我想得到一个数据框,它根据用户对数据集进行分组,每列表示他是否在某一年的某一周出现,每列的类型可以是布尔型,也可以是可能值为0或1的整数
它看起来像这样:
2020_1 2020_2 2020_3 ... 2021_1 2021_2 2021_3 2021_4
John 1 1 0 ... 0 1 0 1
Steve 1 0 0 ... 0 1 0 0
Fred 0 0 1 ... 0 1 0 0
George 0 1 1 ... 1 0 0 1
在不遍历DataFrme的情况下,是否仍然可以执行此操作
谢谢。创建一个新列并使用pd。交叉表
:
pd.crosstab(df['User'],
df[['Year','Week']].astype(str).apply('_'.join, axis=1)
)
输出:
col_0 2020_1 2020_2 2020_3 2021_1 2021_2 2021_4
User
Fred 0 0 1 0 1 0
George 0 1 1 1 0 1
John 1 1 0 0 1 1
Steve 1 0 0 0 1 0
这里有一种方法可以做到这一点:
将熊猫作为pd导入
df=pd.DataFrame({
“用户”:[“约翰”、“约翰”、“史蒂夫”、“弗雷德”、“乔治”、“乔治”],
“年份”:[202020202020020020],
“周”:[1,2,1,3,2,3]})
#为年\周添加帮助器列
df[“年/周”]=df[“年”].map(str)+“周”+df[“周”].map(str)
#按用户和年份/周分组,然后取消堆栈并用0填充NaN
df.groupby([“用户”,“年/周]).size().unstack(填充值=0)
结果:
| User | 2020_1 | 2020_2 | 2020_3 |
|:-------|---------:|---------:|---------:|
| Fred | 0 | 0 | 1 |
| George | 0 | 1 | 1 |
| John | 1 | 1 | 0 |
| Steve | 1 | 0 | 0 |
是的,但我仍然需要根据当年是否存在使用情况,用相应的值填充它,weekI没有得到它,你试过我的代码吗?你不喜欢它的什么地方?对不起,也许我没有说清楚:即使“年·周”中没有任何用户,我也希望该专栏存在。在我的例子中,2021\u 3
中没有人,但我希望该专栏是there@Heathcliff在交叉表之后探索reindex
。使用unstack(fill_value=0)
将保持数据类型为int
。嘿!那是“全港毒品”。每天学习一些新的东西。这三种方法的解决方案都是惊人的。我学到了一些新东西。答复中的所有3位SO成员发送Thx+1对所有3对问题
pd.crosstab(df.User, df['Year'].astype(str)+"_"+df['Week'].astype(str))