【问题标题】:pandas dataframe giving empty frame when variable is used to filter当变量用于过滤时,熊猫数据框给出空框
【发布时间】:2018-07-25 10:32:30
【问题描述】:

我有一个数据框,我需要对其进行过滤。我正在使用

for i in values:
  df = df[df['name'] == i]
  print(df)

这里我得到空的数据框。但是如果我使用df = df[df['name'] == 'manualentryofname'] 就可以了。但是values 是一个名称列表,我需要根据它过滤数据框并执行一些操作。

【问题讨论】:

  • for循环不只是为了过滤..我根据for循环的i值在此下进行了一些操作
  • 对于你的问题,如果values 包含name 它应该可以工作。
  • 因为第一次迭代后它只包含第一个 i 值,第二次迭代后它会返回空数据框
  • 如果您只想在值列表中保留值,则使用@zipa 解决方案,如果您真的想在循环中使用,则不要再次将中间结果存储在 df 中,将中间结果保留在 temp valriable然后尝试附加下一个交互结果,它应该可以工作

标签: python pandas for-loop dataframe


【解决方案1】:

如果您只希望提取与每个name 相关的数据帧行,其中namevalues 中,您可以在过滤器后使用groupby

for key, df_key in df[df['name'].isin(values)].groupby('name'):
    # read dataframe extract in df_key

如果您希望根据name修改部分数据帧,您可以在for 循环中使用掩码:

for key in values:

    # calculate Boolean series mask
    mask = df['name'] == key

    # perform manipulations based on Boolean series
    df.loc[mask, 'some_col'] *= 2
    df.loc[mask, 'some_other_col'] += 1

最佳解决方案将高度依赖于操作的性质。例如,上面的示例操作是可矢量化的,不需要显式的 for 循环。

【讨论】:

    【解决方案2】:

    只需使用:

    df.loc[df['name'].isin(values)]
    

    【讨论】:

    • for循环不只是为了过滤..我根据for循环的i值在此下进行了一些操作
    • @qwww 好的,您能否分享输入和所需输出的示例,以便我进一步帮助您?
    【解决方案3】:

    如果您真的需要使用循环,则需要这样的东西,否则请使用 zipa 的解决方案。它将附加原始过滤结果并附加到另一个临时文件中。

    temp=pd.DataFrame()
    for i in values:
      temp = temp.append(df[df['name'] == i])
    

    【讨论】:

      猜你喜欢
      • 2022-10-04
      • 2018-02-05
      • 1970-01-01
      • 2019-04-13
      • 2015-05-28
      • 2018-02-06
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多