替换空Pandas的中值

2024-05-15 21:13:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

我试过了。在

^{pr2}$

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

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

结果应该是

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

 1           B

然后我有下表,有些天的预约是空的,所以我必须用相同利润和相同组织的中位数来填写这些embty raws。 就像前两个RAW一样,他们是来自同一个组织的医生,所以应该在nan值中填入主题值。在

 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

Tags: ofdf错误mednandaysreservationsroom
2条回答

假设每个非NaN条目只需要第一个字符:

import numpy as np

df['Room'] = np.where(df[0].notnull(), df[0].astype(str).str[0], np.nan)

参见:^{} documentation

在您的第一个数据帧中,Reservation列应该已经是一个对象,因此在删除nan之后,您应该能够像这样获得第一个非nan字符:

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

你的第二个问题。您正在反向使用groupby。分组列放在groupby方法中,聚合列放在外部,如下所示。在

^{pr2}$

然后可以使用以下内容填充缺少的值

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

相关问题 更多 >