使用.rank()在for循环中将数据帧分组

时间:2019-06-08 21:08:17

标签: pandas typeerror pandas-groupby

我正在尝试获取一个数据框,过滤掉非数字值,然后按“状态”字段分组并在每组中对“学校”进行排名。我使用for循环,因为每个状态排名列表都导出到具有状态名称的excel文件。但是,我无法让.rank()在该组上工作。

这行代码

df = df[pd.to_numeric(df['rate1'], errors='coerce').notnull()]

正确地将数据框过滤为仅数字值。但是,当数据中包含非数字值时,尝试对组数据帧进行排名会导致错误,这意味着它无法正常工作。当我尝试对rank()使用参数numeric_only = True时,出现错误“ 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,该s1具有“ rate1”的非数字值。对于print(grouped.groups)类似的结果。但是,如果我在不运行numeric_only = True的情况下运行第一个df ['rank1'],则会收到TypeError:'NoneType'对象不可调用。如果我添加numeric_only = True,则会得到上面显示的意外的关键字参数。如何将干净的df与该小组协调?我意识到在数据框而不是组上进行排序是可行的,但是我需要for循环来为每个状态组导出文件。

0 个答案:

没有答案