【问题标题】:getting string from pandas Series and DataFrames in python?从 python 中的 pandas Series 和 DataFrames 获取字符串?
【发布时间】:2020-06-23 22:23:01
【问题描述】:

我在 pandas 中有这个数据框:

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]

谢谢。

【问题讨论】:

  • 你能扩展一下你的例子吗?现在,您似乎正在将“World”放入并希望将“World”作为输出。
  • @DSM:是的,没错,但想象一下,我们没有使用“名称”,而是使用了不同的列名称,例如:d[d["name"] == "World"]["other_name"] 其中other_name 是一个字符串列
  • 那将是一个更好的例子。 :^) 但在一般情况下,不能保证只有一个匹配值,对吧?所以我怀疑结果将基本上类似于数组。您可以缩短语法——例如,使用maxiget——但除此之外我不确定。也许海登会有一些聪明的东西..

标签: python pandas


【解决方案1】:

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

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

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

或者这个:

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

其中index 是您要在系列中查找的项目的索引。

如果你想把它作为一个字符串,你可能必须将它转换为一个字符串,如果它默认没有被字符串化。

【讨论】:

  • 感谢分享。我不敢相信没有更简单的函数可以调用。
【解决方案2】:

正如@DSM 指出的那样,通常可能有很多行名称为'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。

【讨论】:

  • 我过去一直想知道是否应该有——或者可能有但我只是不知道语法! -- 类似 dict 的过滤方法,这样d.ff({"name": "World"})["c"] 之类的东西就会给出匹配的系列,而无需重复“.name”或“d”。
  • @DSM 我不认为有(只是看看,会看起来更多),但我同意这是一个很好的方法,也许应该还可以在列上使用布尔函数...我想我会添加一个。 :)
【解决方案3】:

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

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

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

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

 max_rows      int, optional

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

 min_rows      int, optional

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

【讨论】:

  • 不! to_string() 函数用于以终端友好的字符串表示形式显示 DataFrame。它会例如在单个字段上使用时缩短长字符串,并且完全不适合 OP 的情况。
  • 同意,添加评论以防万一有人考虑使用它
猜你喜欢
  • 1970-01-01
  • 2015-12-22
  • 2019-06-27
  • 2021-03-22
  • 2023-03-16
  • 2015-06-02
  • 2022-01-23
  • 2017-09-20
  • 1970-01-01
相关资源
最近更新 更多