【问题标题】:Trouble creating a subset dataframe [duplicate]创建子集数据框时遇到问题[重复]
【发布时间】:2021-03-20 09:39:19
【问题描述】:

我正在努力更好地理解 Python 以及我收到错误的原因。

我有一个包含国家名称的数据框,我想过滤数据集以仅显示那些没有重复的数据。我输入了:

df[df['Country Name'].value_counts() == 1]

但是,我得到一个错误

Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match

[df['Country Name'].value_counts() == 1] 似乎创建了一个列表,其中还显示了国家名称和布尔值,而不是我所期望的简单的布尔值。

另外,我尝试仅在一个国家/地区进行过滤,即df[df['Country Name'] == 'United States'],这非常有效。

我只是想了解为什么在一种情况下它有效,而在另一种情况下却无效。我确实注意到后者有一个从 0 开始的索引,所以也许这就是原因。我只是不明白为什么我在前面的示例中没有收到相同的索引。

有人可以帮忙解释一下吗?

【问题讨论】:

  • 嘿,查看how to ask a good question page。有了一个可重复的例子,更多的人会愿意提供帮助。帮助我们为您提供帮助。
  • 请向我们展示一小部分数据框和输入/输出示例

标签: python pandas dataframe filter subset


【解决方案1】:

您的解决方案不起作用,因为生成的数据框比原始数据框短,它们必须具有相同的长度,然后它可以根据布尔值逐行过滤。

另外,我很确定您实际上是在寻找 pandas.DataFrame.drop_duplicates

df.drop_duplicates(subset=['Country Name'], keep = False)

它确实会删除重复值,在这种情况下,您会删除'Country Name',并且您不想保留第一次或最后一次出现,这是keep 的其他选项,然后是keep = False

文档here

【讨论】:

    【解决方案2】:

    这里有一个解释..

    您已提供国家/地区名称..

    df[df['Country Name'] == 'United States']
    

    让我们分开吧,

    df['Country Name'] == 'United States'
    

    为您提供一个序列,其值与带有布尔数据的原始数据帧的长度一样多。

    现在,当你这样做时

    df[df['Country Name'] == 'United States']
    

    您将获得仅包含“美国”的数据框,因为 pandas 直接比较布尔值并返回具有“真”的行。


    现在进行价值计算..

    df[df['Country Name'].value_counts() == 1]
    

    分开这个,

    df['Country Name'].value_counts() == 1
    

    将仅返回唯一的国家名称,如果它们的计数为 == 1,则为布尔格式。如果检查长度,它与df的原始长度不匹配。

    现在,当您尝试对数据框进行子集化时,您会遇到错误。


    解决方案。像他的回答中提到的 Pablo 一样,删除不止一次出现的国家(我没有尝试过。注意 keep = False)。或者,试试下面的..

    如果你想要国家只出现一次的行,你可以试试地图方式..

    df[df['Country Name'].map(df['Country Name'].value_counts()) == 1]
    

    这将返回包含恰好出现一次的国家/地区的数据框。

    或者

    df[df['Country Name'].isin(df['Country Name'].value_counts()[df['Country Name'].value_counts()==1].index)]
    

    【讨论】:

      【解决方案3】:

      试试这个 -

      dataframe 的示例数据

      >>> df = pd.DataFrame ({"Country Name": ["United States", "Canada", "Spain", "France", "India", "Greece", "United States","Canada"], "Exports": ["beef","corn","cattle","cheese","cattle","cheese","pork","maple syrup"]})
      

      显示dataframe

      >>> df
          Country Name      Exports
      0  United States         beef
      1         Canada         corn
      2          Spain       cattle
      3         France       cheese
      4          India       cattle
      5         Greece       cheese
      6  United States         pork
      7         Canada  maple syrup
      

      使用groupby()count() 以返回"Country Name" 的计数

      >>> df.groupby("Country Name")["Country Name"].count()
      Country Name
      Canada           2
      France           1
      Greece           1
      India            1
      Spain            1
      United States    2
      Name: Country Name, dtype: int64
      

      只显示count() == 1这一行

      >>> df[df['Country Name'].map(df.groupby('Country Name')["Country Name"].count()) == 1]
        Country Name Exports
      2        Spain  cattle
      3       France  cheese
      4        India  cattle
      5       Greece  cheese
      

      【讨论】:

        猜你喜欢
        • 2014-07-19
        • 1970-01-01
        • 2023-03-05
        • 2019-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-05
        相关资源
        最近更新 更多