【问题标题】:Removing spaces from a column in pandas从熊猫的列中删除空格
【发布时间】:2021-10-06 22:46:07
【问题描述】:

这与Removing space from columns in pandas 密切相关,所以我不确定是否将其添加到对此的评论中...... 我的问题的不同之处在于使用 loc 定位器来切出一个子集......

df['py'] = df['py'].str.replace(' ','') 

-- 这很好用;但是当我只想将它应用于列子集为“foo”的行子集时:

df.loc[df['column'] == 'foo']['py'] = df.loc[df['column'] == 'foo']['py'].str.replace(' ','')

...不起作用。

我做错了什么?我总是可以切出组并重新附加它,但很好奇我在哪里出错了。

用于试验的数据集:

df = pd.DataFrame({'column':['foo','foo','bar','bar'], 'py':['a b','a b','a b','a b']})

谢谢

【问题讨论】:

  • 您应该会收到一个巨大的红色警告,说明该问题已链接到 assignment ][。您需要使用 df.loc[df['column'] == 'foo', 'py'] = 正确分配(因为在 RHS 上您只是 选择,因此链接是 okay 并且不会引起问题,但对于最佳实践,只需选择也可以在一个地方调用)

标签: python pandas dataframe


【解决方案1】:

你想要:

df.loc[df['column'] == 'foo', 'py'].apply(lambda x: x.replace(' ',''))

注意loc的符号。

【讨论】:

  • 出于性能原因,我不喜欢apply()
  • @FreekWiekmeijer .str 访问器操作本身本质上是循环,因此 apply 和 Series.str 操作之间几乎没有区别(与 .apply 的大多数矢量化数学操作相反不惜一切代价避免)。供参考:stackoverflow.com/questions/54028199/…
【解决方案2】:

Pandas StringAccessor 也支持正则表达式

>>> pd.DataFrame({"column_1": ["hello ", " world", "space in the middle", "two  spaces", "one\ttab"]}).column_1.str.replace(r"\s+", "")

0               hello
1               world
2    spaceinthemiddle
3           twospaces
4              onetab

将它与numpy.where() 结合起来,我认为您拥有所需的一切。

np.where(
   <condition>,  # defines the loc which rows to edit
   df[column_name].str.replace(r"\s+", ""),  # the substitution to make in that loc
   df[column_name]  # the default value used on other rows
)

【讨论】:

    猜你喜欢
    • 2022-10-12
    • 2017-05-19
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2013-12-12
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多