我有一个像这样的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
我需要在旧金山排的最早一个例子中填充“#round”,以及早先迈阿密的一排用“#square”填充。使用.fillna(method =' bfill')不会考虑其他列值,只需用圆形填充所有早期行。
结果将是:
surface city
0 round San Francisco
1 square Miami
2 round San Francisco
3 square Miami
答案 0 :(得分:1)
您可以使用groupby.bfill
;按 city 列对数据框进行分组,然后使用bfill
:
df.groupby('city').bfill()
# surface city
#0 round San Francisco
#1 square Miami
#2 round San Francisco
#3 square Miami
答案 1 :(得分:1)
[根据PSidom]
的令人钦佩的答案进行了修改确实使用groupby()
是关键点,但可能会让人感到困惑,更不用说bfill()
所做的事情,因为它没有按照您的实际想法行事。
让我们快速浏览一下文档here。
它不是像OP想要的那样回填数据,而是在下一列中填写缺少的数据和非缺失数据。
在这种情况下,它适用于groupby()
,而如果您拥有的数据更复杂,您还需要groupby('*your group*').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
看看那里发生了什么? bfill()
在第0行和第1行完成了工作,但第4~7行保持不变。您应该同时使用bfill()
和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()
这样的东西。它会在那里填补一些错误。