在Pandas系列中,当值与另一列匹配时,填充值。

7 浏览
0 Comments

在Pandas系列中,当值与另一列匹配时,填充值。

我有一个如下所示的DataFrame:

import numpy as np
raw_data = {'surface': [np.nan, np.nan, 'round', 'square'],
            'city': ['San Francisco', 'Miami', 'San Francisco', 'Miami']}
df = pd.DataFrame(raw_data, columns = ['surface', 'city'])

它看起来是这样的:

        surface city
   0    NaN     San Francisco
   1    NaN     Miami
   2    round   San Francisco
   3    square  Miami

我需要将早期的“San Francisco”行填充为“round”,并将早期的“Miami”行填充为“square”。使用.fillna(method='bfill')无法考虑其他列的值,并且只会将所有早期行填充为round。

最终结果将是:

        surface city
   0    round   San Francisco
   1    square  Miami
   2    round   San Francisco
   3    square  Miami

0
0 Comments

问题的出现原因是使用了错误的方法df.groupby('city').bfill()来填充缺失值。根据官方文档herebfill()实际上并不是像你想的那样进行向后填充数据,而是使用下一列中的非缺失数据填充缺失数据。因此,需要使用ffill()来进行向前填充以解决这个问题。

解决方法是使用df.groupby('city').bfill()进行向后填充,然后再使用df.groupby('city').ffill()进行向前填充。如下所示:

df2 = df.groupby('city').bfill()
df3 = df2.groupby('city').ffill()

需要注意的是,不要使用df.groupby('city').bfill().ffill(),这样会填入错误的值。

为了进一步说明问题,我们可以修改数据如下:

import numpy as np
import pandas as pd
raw_data = {'surface': [np.nan, np.nan, 'round', 'square', np.nan, np.nan, np.nan, np.nan],
            'city': ['San Francisco', 'Miami', 'San Francisco', 'Miami', 'Miami', 'Miami', 'San Francisco', 'Miami']}
df = pd.DataFrame(raw_data, columns = ['surface', 'city'])
df
#   surface city
#0  NaN     San Francisco
#1  NaN     Miami
#2  round   San Francisco
#3  square  Miami
#4  NaN     Miami
#5  NaN     Miami
#6  NaN     San Francisco
#7  NaN     Miami

使用df.groupby('city').bfill()得到以下结果:

df2 = df.groupby('city').bfill()
df2
#   surface city
#0  round   San Francisco
#1  square  Miami
#2  round   San Francisco
#3  square  Miami
#4  NaN     Miami
#5  NaN     Miami
#6  NaN     San Francisco
#7  NaN     Miami

可以看到,第0行和第1行的数据被填充了,但第4行至第7行的数据没有变化。因此,需要使用df2.groupby('city').ffill()进行向前填充,得到以下结果:

df3 = df2.groupby('city').ffill()
df3
#   surface city
#0  round   San Francisco
#1  square  Miami
#2  round   San Francisco
#3  square  Miami
#4  square  Miami
#5  square  Miami
#6  round   San Francisco
#7  square  Miami

需要注意的是,不要使用df.groupby('city').bfill().ffill(),这样会填入错误的值。

0
0 Comments

问题原因:在给定的示例中,原始数据框包含两列,即"surface"和"city"。需要将"surface"列中的缺失值用与之对应的"city"列中的值进行填充。

解决方法:可以使用groupby.bfill函数进行解决。首先,按"city"列对数据框进行分组,然后使用bfill函数进行向后填充。

具体代码如下:

df.groupby('city').bfill()

通过以上解决方法,在每个城市的数据框中进行向后填充操作。

输出结果如下:

   surface           city
0  round   San Francisco
1  square          Miami
2  round   San Francisco
3  square          Miami

以上解决方法在假设pandas的groupby函数是稳定的情况下有效。

0