当前位置: 首页 > 知识库问答 >
问题:

创建子集数据帧时出现问题[重复]

呼延聪
2023-03-14

我正试图更好地理解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'],效果非常好。

我只是想理解为什么在一个场景中它起作用,而在另一个场景中它不起作用。我确实注意到后者有一个从0开始的索引,所以也许这就是原因。我只是不明白为什么我在前面的例子中没有收到相同的索引。

有人能解释一下吗?

共有3个答案

慕容雅珺
2023-03-14

试试这个-

示例数据为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

除了使用count()之外,还可以使用groupby()“国家/地区名称”返回计数

>>> 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

袁晋鹏
2023-03-14

这里有一个解释...

你提供了国家名称...

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

让我们把这个分开,

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

为您提供一个系列,该系列的值与原始数据帧的布尔数据长度相同。

现在,当你这么做的时候

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

您将得到只包含“美国”的数据帧,因为熊猫直接比较布尔值,并以“真实”返回行。

现在来看看价值统计。。

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

把这个分开,

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

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

现在,当您尝试对数据帧进行子集划分时,您会得到所得到的错误。

解决方案。删除那些像巴勃罗在回答中提到的不止一次出现的国家(我没有尝试过。注意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)]
吕嘉赐
2023-03-14

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

另外,我很确定您实际上正在寻找pandas.DataFrame.drop\u副本

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

它实际上会删除重复的值,在这种情况下,您只需删除“国家/地区名称”,您不想保留第一次或最后一次出现的值,这是保留的其他选项,然后保留=False

这里有文档。

 类似资料:
  • 我希望连接的文件夹中有大约500个数据集。它们都有相同的列名:“年”、“邮政编码”、“Var1”、“Var2”、“Var3”。 我使用以下代码循环浏览文件夹中的文件: 当我输出数据集时,仅显示2019年的数据集和邮政编码000001。我打印了整个文件列表,我想要连接的数据集都在那里。有没有洞察到为什么会出现这种情况?谢谢

  • 我尝试运行上述代码。但它不更新字符串。并且不显示任何错误。数据帧中存在“ABW”数据点。我也给出了数据集的链接。https://github.com/pran9957/world-bank-data.git

  • 我需要从不同的字典中创建一个熊猫数据框架,其中键必须作为数据框架内的列名。如果数据帧没有将键列为列,则必须动态创建键,并将其作为新列附加到数据帧。 我希望输入为, 输出应该是,, 循环的第一次迭代将键作为数据框的列名称,如果没有数据框,则创建值作为第一行的数据框。 第二次迭代检查键是否作为列出现在数据帧中,如果已经出现则插入,否则创建列并插入值作为第二行。 我确实不知道如何在python中动态运行

  • 字典的键是日期,值是一个长度不同的列表 例如,字典是 我想要的是像这样的数据帧

  • 当我像这样创建时,它工作得很好: 但当我尝试发送消息创建if时,它会抛出一个异常: 发送功能: 函数有什么问题?