Pandas 根据定义的列表填充缺失的行
Pandas Filling Missing Rows Based on Defined List
Original
DF 具有根据 table.
计算的值
它可能缺少 type
几个 ID。
但是,如果标志exists
,则目标是明确列出。
如果不是,应在 type
行的 exists
列中添加 no
。
id=1 在这个例子中很好。如果我只过滤 id=2 和 运行 下面的代码,它 returns c。然后我可以 append
.
aa = set(type)
bb = set(b['type'].to_list())
list(aa - bb)
但是,如您所知,这在应用于所有 id 时是不可行的。
我需要帮助才能将代码应用于所有 ID。
这个returns不是
的类型
type = [a, b, c]
Original
id type flag
1 a y
1 b y
1 c y
2 a y
2 b y
3 b y
Goal
id type flag exists
1 a y yes
1 b y yes
1 c y yes
2 a y yes
2 b y yes
2 c y no
3 a y yes
3 b y no
3 b y no
希望有更好的方法来处理这个问题。
关键是在id集和类型集之间生成笛卡尔积。我用过这个 Cartesian product 公理
data = '''id , type , flag
1 , a , y
1 , b , y
1 , c , y
2 , a , y
2 , b , y
3 , b , y '''
da = [[i.strip() for i in l.split(",")] for l in data.split("\n")]
df = pd.DataFrame(da[1:], columns=da[0])
# generate cartesian product https://apassionatechie.wordpress.com/2018/01/15/pandas-equivalent-of-sql-cross-join-cartesian-product/
cp = pd.DataFrame(["a","b","c"], columns=["type"])\
.assign(foo=1)\
.merge(pd.DataFrame(df["id"].unique(), columns=["id"]).assign(foo=1)).drop('foo',1)
df = cp.merge(df, how="outer", on=["id","type"])
df["exists"] = ~df["flag"].isnull()
df.fillna(method="ffill")
输出
type id flag exists
0 a 1 y True
1 a 2 y True
2 a 3 y False
3 b 1 y True
4 b 2 y True
5 b 3 y True
6 c 1 y True
7 c 2 y False
8 c 3 y False
Original
DF 具有根据 table.
它可能缺少 type
几个 ID。
但是,如果标志exists
,则目标是明确列出。
如果不是,应在 type
行的 exists
列中添加 no
。
id=1 在这个例子中很好。如果我只过滤 id=2 和 运行 下面的代码,它 returns c。然后我可以 append
.
aa = set(type)
bb = set(b['type'].to_list())
list(aa - bb)
但是,如您所知,这在应用于所有 id 时是不可行的。
我需要帮助才能将代码应用于所有 ID。
这个returns不是
的类型type = [a, b, c]
Original
id type flag
1 a y
1 b y
1 c y
2 a y
2 b y
3 b y
Goal
id type flag exists
1 a y yes
1 b y yes
1 c y yes
2 a y yes
2 b y yes
2 c y no
3 a y yes
3 b y no
3 b y no
希望有更好的方法来处理这个问题。
关键是在id集和类型集之间生成笛卡尔积。我用过这个 Cartesian product 公理
data = '''id , type , flag
1 , a , y
1 , b , y
1 , c , y
2 , a , y
2 , b , y
3 , b , y '''
da = [[i.strip() for i in l.split(",")] for l in data.split("\n")]
df = pd.DataFrame(da[1:], columns=da[0])
# generate cartesian product https://apassionatechie.wordpress.com/2018/01/15/pandas-equivalent-of-sql-cross-join-cartesian-product/
cp = pd.DataFrame(["a","b","c"], columns=["type"])\
.assign(foo=1)\
.merge(pd.DataFrame(df["id"].unique(), columns=["id"]).assign(foo=1)).drop('foo',1)
df = cp.merge(df, how="outer", on=["id","type"])
df["exists"] = ~df["flag"].isnull()
df.fillna(method="ffill")
输出
type id flag exists
0 a 1 y True
1 a 2 y True
2 a 3 y False
3 b 1 y True
4 b 2 y True
5 b 3 y True
6 c 1 y True
7 c 2 y False
8 c 3 y False