在Pandas系列中,当值与另一列匹配时,填充值。
在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
问题的出现原因是使用了错误的方法df.groupby('city').bfill()来填充缺失值。根据官方文档here,bfill()实际上并不是像你想的那样进行向后填充数据,而是使用下一列中的非缺失数据填充缺失数据。因此,需要使用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(),这样会填入错误的值。
问题原因:在给定的示例中,原始数据框包含两列,即"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函数是稳定的情况下有效。