python - Pandas 过滤并创建新列

标签 python pandas

我有一个 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 + assign 不起作用?

理想情况下我想得到:

           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

关于python - Pandas 过滤并创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67036638/

相关文章:

Python 单元测试 - if 语句中的模块未定义

python - 如何在 Python/Django 中获取图片标题

python - 用python编写AES-CTR解密例程

python - 跨多个数据帧的逐元素平均值和标准差

python - pandas 向量的点积

python - scikit-learn:如何定义 ROC 曲线的阈值?

python - 根据列中存在的值对 Pandas Dataframe 进行切片,该列是列表列表

python panda groupby并消除重复项

Pandas 动态 Groupby 和 Shift

Python 在池映射中使用列表/多个参数