中位数替换Pandas中的空值

时间:2016-12-25 13:21:46

标签: python pandas

我有一个名为Reservation的列,它的一些行是空的,有些行有几个值。 我想在数字之前提取字母

print(df['Reservation'][:24])

0                  NaN
1                  NaN
2                  NaN
3                  NaN
...
24     B57 B59 B63 B66

我试过这个。

df['Room'] = df['Reservation'].astype(str).str[0]

但是我在结果中得到像Nan这样的空值。

print(df['Room'][:3])
0     n
1     n
2     n
3     n

结果应该是

print(df['Room'][:1])

 1           B

然后我有下表,一些Days_of_Reservations是空的,所以我必须填写那些具有相同Profission和相同组织的中位数的embty raws。 就像前两个原始人一样,他们是来自同一组织的医生,所以应该将中间值填入纳米值。

 Organization    Days_of_Reservations     Profission
    or3               4                   Doctor
    0r3               Nan                 Doctor
    or2               2                   Teacher
    or1               3                   Teacher
    or5               Nan                 Dentist

我感到害怕,我得到了这个错误。

med = df.groupby('Days_of_Reservations')['profission']['organization'].transform('median')
df['Days_of_Reservations'].fillna(med)

我收到此错误。

Exception: Column(s) ['profission'] already selected

2 个答案:

答案 0 :(得分:0)

假设您只需要每个非<html> <body> <div> <ul style="color:white; float: right;" class="nav navbar-nav"> <li><a href="/login">Login </a> </li> <li><a href="#">Sign Up </a> </li> </ul> </div> </body> </html> 条目的第一个字符:

NaN

请参阅:numpy.where documentation

答案 1 :(得分:0)

在你的第一个数据框中,Reservation列应该是一个对象,所以你应该能够在删除nans之后得到这样的第一个非nan字符:

df['Room'] = df['Reservation'].dropna().str.get(0)

第二个问题。你正在向后使用groupby。分组列在groupby方法中,聚合列在此外面。

med = df.groupby(['Organization', 'Profission'])['Days_of_Reservations'].median()

然后,您可以使用以下

填写缺失的值
df.set_index(['Organization', 'Profission'])['Days_of_Reservations'].fillna(med)

编辑:请从您的评论中使用以下代码进行测试

# create data for first question
df = pd.DataFrame({'Reservation': [np.nan, np.nan, 'B57 B59 B63 B66']})

# get first letter of non na
df['Room'] = df['Reservation'].dropna().str.get(0)
print(df)

输出继电器

       Reservation Room
0              NaN  NaN
1              NaN  NaN
2  B57 B59 B63 B66    B

第二个问题

测试此代码

s=''' Organization    Days_of_Reservations     Profission
    or3               4                   Doctor
    or3               Nan                 Doctor
    or2               2                   Teacher
    or1               3                   Teacher
    or1               Nan                 Dentist
'''
df = pd.read_csv(StringIO.StringIO(s), sep='\s+')
df['Days_of_Reservations'] = df.Days_of_Reservations.astype(float)
med = df.groupby(['Organization', 'Profission'])['Days_of_Reservations'].median()
df.set_index(['Organization', 'Profission'])['Days_of_Reservations'].fillna(med).reset_index()

输出

  Organization Profission  Days_of_Reservations
0          or3     Doctor                     4
1          or3     Doctor                     4
2          or2    Teacher                     2
3          or1    Teacher                     3
4          or1    Dentist                   NaN