Панды. При броске ValueError: При индексировании на основе целочисленного индекса могут быть только целочисленные индексаторы - PullRequest
0 голосов
/ 10 декабря 2018

Итак, у меня есть df, где я извлекаю одно значение, чтобы сохранить его в другом df:

import pandas as pd

# Create data set
d = {'foo':[100, 111, 222], 
     'bar':[333, 444, 555]}
df = pd.DataFrame(d)

# Full dataframe:
print(df)

# Shows:
#    bar   foo 
# 0  333   100
# 1  444   111
# 2  555   222

df2=pd.DataFrame()
df2.loc[1,'Name'] = df[df.foo == 222]['foo']

#error: 
ValueError: Incompatible indexer with Series

Я предполагаю, что последняя строка выдает эту ошибку, потому что df[df.foo == 222]['foo'] это Series:

2    222
Name: foo, dtype: int64

Поэтому я пытаюсь получить само значение.Я использовал .at и получил это:

print(df[df.foo == 222].loc[:,'bar'].at['bar'])

#ValueError: At based indexing on an integer index can only have integer indexers

Из того, что я прочитал, iat использует целочисленные индексаторы, а at использует и метку, и целое число, так что здесь происходит?

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Использование at с логической маской считается плохой формой, если только вы не можете на 100% гарантировать, что верна только одна строка в маске (в противном случае at не удастся выполнить).

Лучше всего сделатьиспользовать loc и взять первый результат.

df.loc[df.foo == 222, 'bar'].values[0]
555

Для справки at не работает, поскольку возвращает однорядную серию с индексом [2]:

df[df.foo == 222].loc[:,'bar']

2    555
Name: bar, dtype: int64

На данный момент at['bar'] не имеет смысла, потому что он ищет "bar" в индексе, а bar - нет.Что вы должны были сделать, это

df[df.foo == 222].at[2, 'bar']
555
0 голосов
/ 10 декабря 2018

Точка, в которой вы используете at, представляет собой серию Pandas с целочисленным индексом, поэтому вы получаете указанную ошибку.

#ValueError: At based indexing on an integer index can only have integer indexers

Если вы проверяете индексданные, вы увидите индекс со значением 2

df[df.foo == 222].loc[:,'bar'].index

#Int64Index([2], dtype='int64')

Один из правильных методов будет, как указано в coldspeed

df.loc[df.foo == 222].at[2,'bar']

#555
0 голосов
/ 10 декабря 2018

Вы можете легко получить значение, используя values

df2.loc[1,'Name'] = df[df.foo == 222]['foo'].values
df2

#   Name
# 1 222
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...