Здесь приведен пример фрейма данных.

data = [['United Kingdom', 'High income'], ['Albania', 'Upper middle income'], ['Russia', 'Upper middle income'], ['Afganistan','Low income'], ['USA','High income']]
df = pd.DataFrame(data, columns = ['Country', 'Income Group']) 

Здесь я пытался вернуть только страны с высоким доходом и доходом выше среднего:

df = np.where(df['Income Group'] == 'High income' & df['Income Group'] == 'Upper middle income')

Здесь представлены выходные данные:

TypeError: tuple indices must be integers or slices, not str

Но если вы используете то же самое с другими колонками, все работает нормально:

df = np.where(df['Country'] == 'USA')

В чем проблема с колонкой "Группа дохода"?

Очень признателен за любую помощь

Aleksandr Pay

Ответов: 6

Ответы (6)

Другой метод, кроме np.where, для нарезки фрейма данных на основе нескольких условий:

df[ (условие_1) & (условие_2) | (условие_3) ]

Для вашего вопроса, если вы хотите вернуть страны с высоким доходом или доходом выше среднего, вы должны использовать условие or (|), а не and (&)

df_high = df[(df['Income Group'] == 'High income') | (df['Income Group'] == 'Upper middle income')]

df_high

    Country Income   Group
0   United Kingdom   High income
1   Albania          Upper middle income
2   Russia           Upper middle income
4   USA              High income

Вам нужно OR (|) вместо AND (&), и вам нужны скобки вокруг отдельных условий

.
data = [['United Kingdom', 'High income'], ['Albania', 'Upper middle income'], ['Russia', 'Upper middle income'], ['Afganistan','Low income'], ['USA','High income']]
df = pd.DataFrame(data, columns = ['Country', 'Income Group']) 
df = np.where((df['Income Group'] == 'High income') | (df['Income Group'] == 'Upper middle income')) # changed to OR
df

Это просто пропущенные скобки. Потому что в python прецедент & сильнее, чем ==.

Вам нужно что-то вроде:

df = np.where((df['Income Group'] == 'High income') & (df['Income Group'] == 'Upper middle income'))

обновление: и да, как было сказано другими, вам нужен оператор or (|).

data = [['United Kingdom', 'High income'], ['Albania', 'Upper middle income'], 
       ['Russia', 'Upper middle income'], ['Afganistan','Low income'], ['USA','High 
         income']]
df1 = pd.DataFrame(data, columns = ['Country', 'Income Group']) 
df2 = df[df['Income Group']=='High income']
df3 = df[df['Income Group']=='Upper middle income']
df4 = df2.merge(df3,how='outer')
print(df4)

isin также может быть полезен здесь:

df[df['Income Group'].isin(['High income', 'Upper middle income'])]

Вывод:

          Country         Income Group
0  United Kingdom          High income
1         Albania  Upper middle income
2          Russia  Upper middle income
4             USA          High income

Из примера, который вы опубликовали, кажется, что вам не хватает () и вы путаете or с and so | вместо &:

data = [['United Kingdom', 'High income'], ['Albania', 'Upper middle income'], ['Russia', 'Upper middle income'], ['Afganistan','Low income'], ['USA','High income']]
df = pd.DataFrame(data, columns = ['Country', 'Income Group']) 
df = np.where((df['Income Group'] == 'High income') |(df['Income Group'] == 'Upper middle income'))
df
>>>(array([0, 1, 2, 4], dtype=int64),)

которые возвращают индексы вместо dataframe, если вы планируете возвращать dataframe, сделайте так:

df = df[(df['Income Group'] == 'High income') |(df['Income Group'] == 'Upper middle income')]
df
>>> Country Income Group
0   United Kingdom  High income
1   Albania Upper middle income
2   Russia  Upper middle income
4   USA High income

2022 WebDevInsider