python - Pandas 过滤并创建新列
问题描述
我有一个熊猫 df:
import pandas as pd
import numpy as np
df = pd.DataFrame(['Air type:1', 'Space kind:2', 'water', np.NaN], columns = ['A'])
A
0 Air type:1
1 Space kind:2
2 water
3 NaN
我想将 A 中包含“:”的条目拆分为两个新列。因此,我尝试将此操作与 .loc 过滤器结合使用:
df.loc[(df.A.str.contains(':')) & (~df.A.isnull()), ['B', 'C']] = df.A.str.split(':', expand = True)
结果不是很有希望:
A B C
0 Air type:1 NaN NaN
1 Space kind:2 NaN NaN
2 water NaN NaN
3 NaN NaN NaN
如果我不过滤它会起作用:
df[['B', 'C']] = df.A.str.split(':', expand = True)
A B C
0 Air type:1 Air type 1
1 Space kind:2 Space kind 2
2 water water None
3 NaN NaN NaN
问题是该water
条目被错误地分配给新列,之后我必须手动修复它。
为什么.loc
+ 分配不起作用?
理想情况下,我想得到:
A B C
0 Air type:1 Air type 1
1 Space kind:2 Space kind 2
2 water NaN NaN
3 NaN NaN NaN
解决方案
尝试使用以下条件进行检查df.where
:
c = c = df['A'].str.contains(":")
#c = df['A'].str.count(":").ge(1)
df[['B', 'C']] = df['A'].str.split(":",expand=True).where(c)
print(df)
A B C
0 Air type:1 Air type 1
1 Space kind:2 Space kind 2
2 water NaN NaN
3 NaN NaN NaN
推荐阅读
- javascript - 从 json 文件中以正确的顺序输入日期
- javascript - 使用 wtforms、flask、javascript 在下拉列表中搜索过滤器
- user-interface - 博尼塔工作室 | UI 设计师 - 关系下拉菜单
- python - 如何仅为当前实例选择多对多对象
- c# - 通过 configurationBuilder.AddJsonFile() 添加自定义 JSON 配置文件时如何摆脱第一个对象层
- arrays - 如何沿二维数组的轴打印索引指南
- java - 从 KTable 中删除数据
- c++ - 在 C++ 中读/写文件,选择选项
- openstreetmap - 用纬度或经度指示器反应传单标记位置
- google-cloud-platform - GCP - 从 API Gateway 访问 Google Cloud Run 后端