Скалярная ошибка при замене жестко закодированной строки для переменной с пандами - PullRequest
0 голосов
/ 22 мая 2018

df1 выглядит примерно так:

  name  age
1 Bobby 17
2 Sally 23
3 John  19

df2 выглядит так:

  name  city      state
1 Bobby Lakeside  MN
2 Sally Carlstown MS
3 John  Wallsburg UT

Я зацикливаюсь на DataFrame, df1, вот так:

for row in df1.itertuples(name='Pandas', index=True):
    name = getattr(row, "name")
    print(type(name))
    print(name)

и я получу (как и ожидалось):

<type 'str'>
Bobby
<type 'str'>
Sally
<type 'str'>
John

Затем я ищу второй фрейм данных, df2, и получаю его местоположение строки (индекс), поэтому я могу получить дополнительную информацию.

i = df2[(df2['name'] == "Bobby").index.item()

i теперь является целым числом ... работает как чемпион.Он нашел Бобби в другом DataFrame, df2 и walla!Дали мне индексный номер.

Однако ... , если я попытаюсь заменить жестко закодированную строку "Bobby" на переменную, подобную этой ...

for row in df1.itertuples(name='Pandas', index=True):
    name = getattr(row, "name")
    i = df2[(df2['name'] == name)].index.item()

затем он взрывается и умирает.

for row in df1.itertuples(name='Pandas', index=True):
    name = getattr(row, "name")
    i = df2[(df2['name'] == str(name))].index.item()

Я получаю следующее исключение:

ValueError: can only convert an array of size 1 to a Python scalar

Я в полной растерянности, помогите!и спасибо!

1 Ответ

0 голосов
/ 22 мая 2018

Ваша логика кажется слишком сложной.Вы можете создать имя для сопоставления возраста с df1 и повторить df2.iterrows.Нет необходимости получать доступ к индексам, если у вас нет повторяющихся имен.В последнем случае вы можете использовать индекс.

s = df1.set_index('name')['age']

for _, row in df2.iterrows():
    print('{0} who is {1} lives in {2}'.format(row['name'], s.get(row['name']), row.city))

Bobby who is 17 lives in Lakeside
Sally who is 23 lives in Carlstown
John who is 19 lives in Wallsburg
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...