Как использовать .loc в fstrings? - PullRequest
       31

Как использовать .loc в fstrings?

0 голосов
/ 04 октября 2018

У меня есть такой фрейм данных:

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'

Как это можно исправить?

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

То, что вы видите, - это строковое представление и уродливые символы новой строки \n для объекта pd.Series, возвращаемого процессором loc.

Вы должны использовать 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)']
0 голосов
/ 04 октября 2018
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']

это то, что вы ищете?

Также вы можете сделать цикл через х диапазон

[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']
...