【问题标题】:Slicing a Pandas Dataframe Using Two Strings使用两个字符串对 Pandas 数据框进行切片
【发布时间】:2015-10-10 04:53:32
【问题描述】:

我有一个大数据框。我想选择适用于 Machine1 和 NorthAmerica 的数据。所以如果 Machine1 和 NorthAmerica 在一行数据中,我想保留该行。

我知道如何满足一个要求:

df = df[df['MachineNumber'].isin(['Machine1'])]

完美运行并切分我需要的所有数据。但是,我不知道如何为两件事做到这一点。

我尝试了两次,分别像这样:

df = df[df['MachineNumber'].isin(['Machine1'])]
df = df[df['Region'].isin(['NorthAmerica'])]

我也试过了

df = df[(df['Region']=='NorthAmerica') & (df['MachineNumber']=='Machine1')]

但两次尝试都会抛出错误TypeError: unsupported type for add operation,并且它返回一个只有列名的空数据框。我也在网上查看了解决方案,但他们专注于第二种解决方案,但使用的是数字而不是字符串。我怎样才能正确地做到这一点?

一个示例数据框输入是一个名为sortingdata.csv的csv,它有两列:

Region  MachineNumber
EU  Machine1
EU  Machine1
EU  Machine1
EU  Machine1
EU  Machine1
EU  Machine1
EU  Machine1
EU  Machine1
EU  Machine2
NA  Machine2
NA  Machine2
NA  Machine2
NA  Machine2
EMEA    Machine2
NA  Machine2
NA  Machine2
NA  Machine1
NA  Machine1
NA  Machine1
NA  Machine1
NA  Machine1
NA  Machine1
NA  Machine1
NA  Machine1
NA  Machine1

代码是

import pandas as pd
df = pd.read_csv('sortingdata.csv') 

df = df[(df['Region']=='NorthAmerica') & (df['MachineNumber']=='Machine1')]

它运行良好,但在这种情况下打印和空 DataFrame。

【问题讨论】:

  • 你能上传一个样本数据文件来重现错误吗? df = df[(df['Region']=='NorthAmerica') & (df['MachineNumber']=='Machine1')] 在我看来是合理的。
  • @JohnE 这不是什么问题,因为我只想用 Machine1 处理 NorthAmerica 的数据 df,所以我可以覆盖它。
  • @JianxunLi 我添加了示例数据,您可以将行复制粘贴到 csv 文件中。它返回一个空数据框
  • jenryb & @JianxunLi -- 我发布了一个关于 NaN 问题的后续问题:stackoverflow.com/questions/31528621/…
  • @JohnE ,我对代码有进一步的问题,但它略有不同,所以我提出了一个新问题。如果您有兴趣,请点击这里:stackoverflow.com/questions/31543959/…

标签: python pandas dataframe typeerror


【解决方案1】:

代码似乎适用于您的示例数据。

# data
# ==================================
df

   Region MachineNumber
0      EU      Machine1
1      EU      Machine1
2      EU      Machine1
3      EU      Machine1
4      EU      Machine1
5      EU      Machine1
6      EU      Machine1
7      EU      Machine1
..    ...           ...
17     NA      Machine1
18     NA      Machine1
19     NA      Machine1
20     NA      Machine1
21     NA      Machine1
22     NA      Machine1
23     NA      Machine1
24     NA      Machine1

[25 rows x 2 columns]

# processing
# ===============================
df[(df['Region']=='NA') & (df['MachineNumber']=='Machine1')]

   Region MachineNumber
16     NA      Machine1
17     NA      Machine1
18     NA      Machine1
19     NA      Machine1
20     NA      Machine1
21     NA      Machine1
22     NA      Machine1
23     NA      Machine1
24     NA      Machine1

【讨论】:

  • 嗯。感谢您最终运行它...我将重新启动 python 看看是否有帮助!
  • 简,我想我找到了问题所在。出于某种原因,我的数据框正在将 NorthAmerica 的“NA”更改为“NaN”,这就是它返回空数据框的原因。 (我使用的是 Python 2.7)我想知道为什么它在你的版本中没有这样做。
  • @jenryb 呃,我实际上遇到了和你一样的问题,我使用df = df.fillna('NA')手动转换它以使用NA替换所有NaNs
  • 这是一个有用的解决方案,但不幸的是,代码中其他地方还有其他 NA 值实际上是 NaN。如果您有兴趣,这里有一个单独的问题:stackoverflow.com/questions/31543959/…
猜你喜欢
  • 2017-10-08
  • 2018-10-21
  • 2017-06-03
  • 2021-12-07
  • 2020-05-04
  • 2020-04-12
  • 2021-03-12
  • 2012-07-13
  • 1970-01-01
相关资源
最近更新 更多