如何在 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 进行切片,列表中可能包含在索引/列中找不到的元素