根据列表值更新 Pandas Dataframe 中的行
Update rows in Pandas Dataframe based on the list values
我有一个如下所示的 DataFrame:
product units_sold week
sku 5 W01
sku 3 W02
sku 2 W03
sku 4 W04
sku 6 W05
sku 5 W36
sku 3 W38
sku 2 W39
sku 4 W40
在 'week' 中,缺少 w37,并且列的顺序错误:
我有一个包含所有需要的行和正确顺序的列表:
week_list = ['W36','W37','W38','W39','W40','W01','W02','W03','W04','W05']
期望的输出是:
product units_sold week
sku 5 W36
sku 0 W37
sku 5 W38
sku 2 W39
sku 4 W40
sku 6 W01
sku 3 W02
sku 2 W03
sku 4 W04
sku 6 W05
W37 到位且 'unit_sold' 为 0
只添加一列的解决方案不适合,因为我有一个很大的 DataFrame,并且可能还有其他缺失的行。
我试过 pd.sort_values 和 pd.categorical:
def sorter(column):
reorder = week_list
cat = pd.Categorical(column, categories=reorder, ordered=True)
return pd.Series(cat)
df.sort_values(by="week", key=sorter)
这帮助我设置了正确的顺序,但是 'w37' 仍然缺失,所以问题没有解决。
有什么方法可以根据此列表更新 DataFrame 行值吗?
IIUC 只需使用 reindex
:
print (df.set_index("week").reindex(week_list).fillna({"product":"sku", "units_sold": 0}))
product units_sold
week
W36 sku 5.0
W37 sku 0.0
W38 sku 3.0
W39 sku 2.0
W40 sku 4.0
W01 sku 5.0
W02 sku 3.0
W03 sku 2.0
W04 sku 4.0
W05 sku 6.0
我有一个如下所示的 DataFrame:
product units_sold week
sku 5 W01
sku 3 W02
sku 2 W03
sku 4 W04
sku 6 W05
sku 5 W36
sku 3 W38
sku 2 W39
sku 4 W40
在 'week' 中,缺少 w37,并且列的顺序错误:
我有一个包含所有需要的行和正确顺序的列表:
week_list = ['W36','W37','W38','W39','W40','W01','W02','W03','W04','W05']
期望的输出是:
product units_sold week
sku 5 W36
sku 0 W37
sku 5 W38
sku 2 W39
sku 4 W40
sku 6 W01
sku 3 W02
sku 2 W03
sku 4 W04
sku 6 W05
W37 到位且 'unit_sold' 为 0
只添加一列的解决方案不适合,因为我有一个很大的 DataFrame,并且可能还有其他缺失的行。
我试过 pd.sort_values 和 pd.categorical:
def sorter(column):
reorder = week_list
cat = pd.Categorical(column, categories=reorder, ordered=True)
return pd.Series(cat)
df.sort_values(by="week", key=sorter)
这帮助我设置了正确的顺序,但是 'w37' 仍然缺失,所以问题没有解决。
有什么方法可以根据此列表更新 DataFrame 行值吗?
IIUC 只需使用 reindex
:
print (df.set_index("week").reindex(week_list).fillna({"product":"sku", "units_sold": 0}))
product units_sold
week
W36 sku 5.0
W37 sku 0.0
W38 sku 3.0
W39 sku 2.0
W40 sku 4.0
W01 sku 5.0
W02 sku 3.0
W03 sku 2.0
W04 sku 4.0
W05 sku 6.0