【问题标题】:Python Dataframe: Remove Rows from Dataframe Using a LoopPython Dataframe:使用循环从 Dataframe 中删除行
【发布时间】:2018-06-17 18:32:40
【问题描述】:

我想从我的 pandas 数据框中删除某些行。我以手动方式拼写出我不想包含的每个项目编号。

如何使用循环执行与以下代码所示相同的任务?

df_adhoc_1_final = df_adhoc_1_final[df_adhoc_1_final['ITEM'].str.contains('4888') == False]
df_adhoc_1_final = df_adhoc_1_final[df_adhoc_1_final['ITEM'].str.contains('4889') == False]
df_adhoc_1_final = df_adhoc_1_final[df_adhoc_1_final['ITEM'].str.contains('4890') == False]
df_adhoc_1_final = df_adhoc_1_final[df_adhoc_1_final['ITEM'].str.contains('4891') == False]
df_adhoc_1_final = df_adhoc_1_final[df_adhoc_1_final['ITEM'].str.contains('4892') == False]
df_adhoc_1_final = df_adhoc_1_final[df_adhoc_1_final['ITEM'].str.contains('4893') == False]

【问题讨论】:

  • 一般来说,如果你使用带有 DF 的循环,你就做错了。
  • 我强烈不同意接受的答案。您应该尽可能避免使用循环。请记住,与 .str.contains 或 .isin 相比,它们不仅更麻烦,而且效率低下
  • 如果您的目标是解决另一个除了循环之外不能使用任何东西的问题,您可能应该重新评估您的策略,因为您做错了。

标签: python loops dataframe rows


【解决方案1】:

怎么样:

for val in ['4888','4889','4890','4891','4892','4893']:
    df_adhoc_1_final = df_adhoc_1_final[df_adhoc_1_final['ITEM'].str.contains(val) == False]

【讨论】:

  • 不,我不宽恕这个。使用 pandas 时请尽量避免循环。
  • 同意。但我的答案必须和你的不同。因此。
【解决方案2】:

这里不需要循环。任何 pandas 操作几乎总是有一种矢量化的、非循环的方法。这是一种方法。

首先,初始化一个代码列表——

codes = ['4888', '4889', ... '4893']

或者,

codes = np.arange(4888, 4894).astype(str)

现在,使用str.contains 进行过滤。您需要使用| OR 管道将每个代码作为单个正则表达式加入 -

df = df[~df['ITEM'].str.contains('|'.join(codes))]

如果代码是ITEM 列中的唯一内容,您可以使用isin -

df = df[~df['ITEM'].isin(codes)]

【讨论】:

    猜你喜欢
    • 2019-03-22
    • 2021-05-22
    • 2012-09-14
    • 2017-07-01
    • 2022-10-25
    • 2013-12-16
    • 2023-04-05
    • 1970-01-01
    • 2018-10-13
    相关资源
    最近更新 更多