如何在 fstrings 中使用 .loc?

Posted

技术标签:

【中文标题】如何在 fstrings 中使用 .loc?【英文标题】:How to use .loc in fstrings? 【发布时间】:2019-03-09 16:07:35 【问题描述】:

我有一个这样的数据框:

import pandas as pd

df = pd.DataFrame('col1': ['abc', 'def', 'tre'],
                   'col2': ['foo', 'bar', 'stuff'])

  col1   col2
0  abc    foo
1  def    bar
2  tre  stuff

还有这样的字典:

d = 'col1': [0, 2], 'col2': [1]

字典包含要从数据框中提取的列名和值的索引以生成如下字符串:

abc (0, col1)

因此,每个字符串都以元素本身开头,括号中显示索引和列名。

我尝试了以下列表理解:

l = [f"df.loc[indi, ci] (indi, ci)"
     for ci, vali in d.items()
     for indi in vali]

产生

['  col1\n0  abc (0, col1)',
 '  col1\n2  tre (2, col1)',
 '  col2\n1  bar (1, col2)']

所以,几乎没问题,只是需要避免 col1\n0 部分。

如果我尝试

f"df.loc[0, 'col1'] is great"

我明白了

'abc is great'

然而,根据需要,使用

x = 0
f"df.loc[x, 'col1'] is great"

我明白了

'0    abc\nName: col1, dtype: object is great'

如何解决这个问题?

【问题讨论】:

【参考方案1】:
import pandas as pd

df = pd.DataFrame('col1': ['abc', 'def', 'tre'],
                   'col2': ['foo', 'bar', 'stuff'])

d = 'col1': [0, 2], 'col2': [1]
x = 0
[f"df.loc[x, 'col1'] is great"
     for ci, vali in d.items()
     for indi in vali]

给你:

['abc is great', 'abc is great', 'abc is great']

这是你要找的吗?

你也可以在 x 范围内循环

[f"df.loc[i, 'col1'] is great"
 for ci, vali in d.items()
 for indi in vali
 for i in range(2)]

#output
['abc is great',
 'def is great',
 'abc is great',
 'def is great',
 'abc is great',
 'def is great']

【讨论】:

谢谢,但您不使用字典d。但是@jpp 的答案解决了。比预期的要容易。【参考方案2】:

您看到的是loc 访问器返回的pd.Series 对象的字符串表示形式和丑陋的换行符\n

您应该使用pd.DataFrame.at 来返回标量,并注意这里不需要为您的索引标签嵌套

L = [f'df.at[indi, ci] (indi, ci)' \
     for ci, vali in d.items() \
     for indi in vali]

print(L)

['abc (0, col1)', 'tre (2, col1)', 'bar (1, col2)']

【讨论】:

太好了,只需删除 就可以解决问题,即使使用.loc,但.at 可能更快。

以上是关于如何在 fstrings 中使用 .loc?的主要内容,如果未能解决你的问题,请参考以下文章

Python面试必考重点之字符串与正则表达式第二关——用fstring方法格式化字符串

Python基础(19) - 使用fstring方法格式化字符串

如何使用 .loc 对 DF 进行切片,列表中可能包含在索引/列中找不到的元素

如何在 Pandas 或 Python 中根据某些条件放置项目?

如何在熊猫中分组、循环和获取结果作为数据框

UE4中FString转UTF8及UTF8转FString