Использование .rank () для группировки данных в цикле for - PullRequest
0 голосов
/ 09 июня 2019

Я пытаюсь взять фрейм данных, отфильтровать нечисловые значения, а затем сгруппировать по полю «штат» и рангу «школа» в каждой группе. Я использую цикл 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 для экспорта файла для каждой группы состояний.

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