Pandas 按组填写
Pandas fillna by group
首先,这听起来像是一个非常愚蠢的问题,我认为答案应该很简单。
然而...我被这个问题困扰了几个星期,但我仍然无法解决它。
我需要的是在组中使用 fillna(method="ffill")
之类的东西。考虑下面的 DataFrame:
import pandas as pd
df = pd.read_csv("something.csv"
>>> df
group date price
0 1 2021-12-01 .15
1 1 2022-01-15 NaN
2 1 2021-02-03 .35
3 2 2021-12-01 NaN
4 2 2021-12-15 2.5
5 2 2022-02-03 NaN
6 3 2021-11-15 3.25
6 3 2021-12-03 NaN
6 3 2022-01-06 NaN
期望的输出是:
>>> df
group date price
0 1 2021-12-01 .15
1 1 2022-01-15 .15
2 1 2021-02-03 .35
3 2 2021-12-01 NaN
4 2 2021-12-15 2.5
5 2 2022-02-03 2.5
6 3 2021-11-15 3.25
6 3 2021-12-03 3.25
6 3 2022-01-06 3.25
到目前为止我已经尝试过:
df["price"] = df.groupby(["group", "date"])["price"].ffill()
df["price"] = df.groupby(["group", "date"])["price"].fillna(method="ffill")
df = df.groupby(["group", "date"]).fillna(method="ffill")
df["price"] = df.groupby(["group", "date"])["price"].apply(lambda x :x.ffill())
我找到了几个类似的答案,但其中 none 给出了预期的结果。
我想你错过了简单的:
df['price'] = df.groupby('group')['price'].ffill()
确实,您不应该按日期分组,因为您只有大小为 1 的组。
输出(为清楚起见,使用不同的列):
group date price price_ffill
0 1 2021-12-01 0.15 0.15
1 1 2022-01-15 NaN 0.15
2 1 2021-02-03 0.35 0.35
3 2 2021-12-01 NaN NaN
4 2 2021-12-15 2.50 2.50
5 2 2022-02-03 NaN 2.50
6 3 2021-11-15 3.25 3.25
6 3 2021-12-03 NaN 3.25
6 3 2022-01-06 NaN 3.25
首先,这听起来像是一个非常愚蠢的问题,我认为答案应该很简单。
然而...我被这个问题困扰了几个星期,但我仍然无法解决它。
我需要的是在组中使用 fillna(method="ffill")
之类的东西。考虑下面的 DataFrame:
import pandas as pd
df = pd.read_csv("something.csv"
>>> df
group date price
0 1 2021-12-01 .15
1 1 2022-01-15 NaN
2 1 2021-02-03 .35
3 2 2021-12-01 NaN
4 2 2021-12-15 2.5
5 2 2022-02-03 NaN
6 3 2021-11-15 3.25
6 3 2021-12-03 NaN
6 3 2022-01-06 NaN
期望的输出是:
>>> df
group date price
0 1 2021-12-01 .15
1 1 2022-01-15 .15
2 1 2021-02-03 .35
3 2 2021-12-01 NaN
4 2 2021-12-15 2.5
5 2 2022-02-03 2.5
6 3 2021-11-15 3.25
6 3 2021-12-03 3.25
6 3 2022-01-06 3.25
到目前为止我已经尝试过:
df["price"] = df.groupby(["group", "date"])["price"].ffill()
df["price"] = df.groupby(["group", "date"])["price"].fillna(method="ffill")
df = df.groupby(["group", "date"]).fillna(method="ffill")
df["price"] = df.groupby(["group", "date"])["price"].apply(lambda x :x.ffill())
我找到了几个类似的答案,但其中 none 给出了预期的结果。
我想你错过了简单的:
df['price'] = df.groupby('group')['price'].ffill()
确实,您不应该按日期分组,因为您只有大小为 1 的组。
输出(为清楚起见,使用不同的列):
group date price price_ffill
0 1 2021-12-01 0.15 0.15
1 1 2022-01-15 NaN 0.15
2 1 2021-02-03 0.35 0.35
3 2 2021-12-01 NaN NaN
4 2 2021-12-15 2.50 2.50
5 2 2022-02-03 NaN 2.50
6 3 2021-11-15 3.25 3.25
6 3 2021-12-03 NaN 3.25
6 3 2022-01-06 NaN 3.25