16

我在熊猫中有这个数据框:

d=pandas.DataFrame([{"a": 1, "b": 1}, {"c": 2, "b": 4}])
d["name"] = ["Hello", "World"]

我想根据“名称”列中的字符串值选择一个元素,然后将值作为字符串获取。要选择元素:

d[d["name"] == "World"]["name"]
Out:
1    World
Name: name

问题是它没有给出一个简单的字符串,而是一个系列。转换为字符串无济于事——我怎样才能从中"World"取出字符串?这是唯一的方法吗?

d[d["name"] == "World"]["name"].values[0]

谢谢。

4

3 回答 3

20

有一种没有人提到的方法可能值得注意。这是我在进行多项标准检查并取回单个项目系列(基本上是唯一的行结果)时遇到的问题。如果您在系列中有一个项目并且只需要该项目或知道您要收集的特定项目的索引,只需执行以下操作:

d[d["name"] == "World"].tolist()[0]

对于单个项目系列中的第一个(也是唯一一个)项目。

或这个:

d[d["name"] == "World"].tolist()[index]

index您在系列中查找的项目的索引在哪里。

如果您希望将其作为字符串,如果默认情况下尚未字符串化,则可能必须将其转换为字符串。

于 2015-12-25T07:38:03.943 回答
10

正如@DSM 指出的那样,通常可能有很多行带有 name 'World',所以我们需要在某个地方选择一个。

一种看起来不错的方法是使用where(然后max):

In [11]: d.name.where(d.name == 'World', np.nan)
Out[11]: 
0      NaN
1    World
Name: name, dtype: object

In [12]: d.name.where(d.name == 'World', np.nan).max()
Out[12]: 'World'

注意:如果没有名称为“World”的行,这将返回 NaN。

于 2013-03-29T15:36:39.647 回答
1

更新:不推荐,因为它会截断长文本,除非使用 pandas > 1.0(未测试)

不确定这适用于哪些版本的 Pandas,但它是另一种选择:

d[d["name"] == "World"].to_string(index=False)

如果不止一行,还有其他选项:

 max_rows      int, optional

截断前显示的最大行数。如果没有,则显示全部。

 min_rows      int, optional

在截断的 repr 中显示的行数(当行数高于 max_rows 时)。

于 2020-05-12T05:19:25.357 回答