Я пытаюсь взять фрейм данных, отфильтровать нечисловые значения, а затем сгруппировать по полю «штат» и рангу «школа» в каждой группе. Я использую цикл for, потому что каждый ранжированный список состояний экспортируется в файлы Excel с именем состояния. Однако я не могу заставить .rank () работать в группе.
Эта строка кода
df = df[pd.to_numeric(df['rate1'], errors='coerce').notnull()]
правильно фильтрует кадр данных только по числовым значениям. Но попытка ранжировать групповые кадры данных приводит к ошибке, когда в данных содержится нечисловое значение, что означает, что оно работает неправильно. Когда я пытаюсь использовать параметр numeric_only = True для rank (), я получаю сообщение об ошибке "TypeError: rank () получил неожиданный аргумент ключевого слова 'numeric_only'"
# In[24]:
import pandas as pd
# In[25]:
data = {'school_name': ['s1', 's2', 's3', 's4', 's5','s6', 's7', 's8'],
'state': ['tx', 'wa', 'wa', 'ak', 'tx', 'ak', 'tx', 'tx'],
'rate1': ['text', 4, 2, 1, 5, 7, 8, 6],
'rate2' : [2, 1, 6, 3, 2, 4, 3, 8]}
df = pd.DataFrame(data)
# In[26]:
df = df[pd.to_numeric(df['rate1'], errors='coerce').notnull()]
print(df)
# Out[26]:
school_name state rate1 rate2
1 s2 wa 4 1
2 s3 wa 2 6
3 s4 ak 1 3
4 s5 tx 5 2
5 s6 ak 7 4
6 s7 tx 8 3
7 s8 tx 6 8
# In[27]:
grouped = df.groupby('state')
print(grouped.groups)
# Out[27]:
{'ak': Int64Index([3, 5], dtype='int64'), 'tx': Int64Index([4, 6, 7], dtype='int64'), 'wa': Int64Index([1, 2], dtype='int64')}
# In[29]:
for name, group in grouped:
df['rank1'] = df.groupby('state')['rate1'].rank(method='min', numeric_only=True)
df['rank2'] = df.groupby('state')['rate2'].rank(method='min')
df['final_rank'] = df['rank1'] + df['rank2']
df = df.sort_values(by=['state', 'final_rank'])
TypeError Traceback (most recent call last)
<ipython-input-29-1af08256aabd> in <module>
4 for name, group in grouped:
----> 5 df['rank1'] = df.groupby('state')['rate1'].rank(method='min', numeric_only=True)
6 df['rank2'] = df.groupby('state')['rate2'].rank(method='min')
7 df['final_rank'] = df['rank1'] + df['rank2']
TypeError: rank() got an unexpected keyword argument 'numeric_only'
Так что в Out [26] я вижу, что он правильно отфильтровывает s1, который имеет нечисловое значение для 'rate1'. Аналогичный результат для печати (grouped.groups). Однако, если я запускаю первый df ['rank1'] без numeric_only = True, я получаю объект TypeError: NoneType не вызывается. Если я добавлю numeric_only = True, я получу неожиданный аргумент ключевого слова, показанный выше. Как мне примирить чистый df с группой? Я понимаю, что сработало бы ранжирование на фрейме данных вместо группы, но мне нужен цикл for для экспорта файла для каждой группы состояний.