我正在尝试获取一个数据框,过滤掉非数字值,然后按“状态”字段分组并在每组中对“学校”进行排名。我使用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循环来为每个状态组导出文件。