python - 如何用 pandas 构造向量化函数?
问题描述
我不确定如何构建我想在熊猫中矢量化的函数。
我有两个像这样的df:
contents = pd.DataFrame({
'Items': [1, 2, 3, 1, 1, 2],
})
cats = pd.DataFrame({
'Cat1': ['1|2|4'],
'Cat2': ['3|2|5'],
'Cat3': ['6|9|11'],
})
我的目标是为每行.insert
创建一个新列,如果是元素或其他。这是要重复每。contents
1
contents['Items']
cats['cat1']
0
cat
目标格式:
contents = pd.DataFrame({
'Items': [1, 2, 3, 1, 1, 2],
'contains_Cat1': [1, 1, 0, 1, 1, 1],
'contains_Cat2': [0, 1, 1, 0, 0, 1],
'contains_Cat3': [0, 0, 0, 0, 0, 0],
})
由于我的内容 df 很大(!),我想对其进行矢量化。我对每只猫的方法是做这样的事情
contents.insert(
loc=len(contents.columns),
column='contains_Cat1',
value=has_content(contents, cats['Cat1'])
def has_content(contents: pd.DataFrame, cat: pd.Series) -> pd.Series:
# Initialization of pd.Series here??
if contents['Items'] in cat:
return True
else:
return False
我的问题是:我如何构建我的has_content(...)
?我特别不清楚的是我如何初始化该 pd.Series 以包含所有False
值。我什至需要吗?之后,我知道如何检查某些东西是否包含在其他东西中。但是我真的可以像上面那样按列执行并立即返回而不变成单元格吗?
解决方案
尝试使用,然后使用和str.get_dummies
重塑stack
unstack
out = cats.stack().str.get_dummies().stack()\
.unstack(level=1).reset_index(level=0,drop=True)\
.reindex(contents.Items.astype(str))
Out[229]:
Cat1 Cat2 Cat3
Items
1 1 0 0
2 1 1 0
3 0 1 0
1 1 0 0
1 1 0 0
2 1 1 0
改进:
out=cats.stack().str.get_dummies().droplevel(0).T\
.add_prefix('contains_').reindex(contents['Items'].astype(str)).reset_index()
Out[230]:
Items contains_Cat1 contains_Cat2 contains_Cat3
0 1 1 0 0
1 2 1 1 0
2 3 0 1 0
3 1 1 0 0
4 1 1 0 0
5 2 1 1 0
推荐阅读
- python - 使用 pandas 将 csv 文件中的特定列更改为整数
- python - 重新索引 Pandas 数据框
- python - 如何使用 pyinstaller 构建此脚本?
- java - 带有 MongoDB 的 Apache Camel 路由出现错误 No bean could be found in the registry
- wpf - 语言更改后更新组合框
- ubuntu - 'cat' 不是内部或外部命令、可运行程序或批处理文件
- vim - vim 的 nord 配色方案与文档不匹配
- javascript - 我正在使用 selectpicker 我想编辑来自数据库的数据,但所有选项都已被选中
- python - 以累积方式隔离数据并根据日期保存在列中
- azure-devops - Azure 数据同步停止工作 btw 两个 Azure SQL 数据库(不显示错误消息)