两个数据帧的 Pandas join.fillna 不仅将所有值替换为 nan
Pandas join.fillna of two data frames replaces all all values with anf not only nan
以下代码将根据索引更新库存商品数量。旧库存的 table dr 持有 >1000 个值。更新后的数据框 grp1 包含已售商品的数量。我想从数据帧 dr 中减去数据帧 grp1 并更新 dr。一切都很好,直到我想加入 grp1 与 Panda 的 join 和 fillna。首先,数据类型从 int 更改为 float,不仅 NaN,notnull 值也被替换为 0。这是索引不匹配的问题吗?
我试图使数据类型统一,但这并没有改变任何东西。在加入两个数据帧时删除 fillna returns 所有列的 NaN。
dr has the following format (example):
druck_pseudonym lager_nr menge_im_lager
80009359 62808 1
80009360 62809 10
80009095 62810 0
80009364 62811 11
80009365 62812 10
80008572 62814 10
80009072 62816 18
80009064 62817 13
80009061 62818 2
80008725 62819 3
80008940 62820 12
dr.dtypes
lager_nr int64
menge_im_lager int64
dtype: object
and grp1 (example):
LagerArtikelNummer1 ArtMengen1
880211066 1
80211070 1
80211072 2
80211073 2
80211082 2
80211087 4
80211091 1
80211107 2
88889272 1
88889396 1
ArtMengen1 int64
dtype: object
#update list with "nicht_erledigt"
dr_update = dr.join(grp1).fillna(0)
dr_update["menge_im_lager"] = dr_update["menge_im_lager"] - dr_update["ArtMengen1"]
这个returns:
lager_nr menge_im_lager ArtMengen1
druck_pseudonym
80009185 44402 26.0 0.0
80009184 44403 2.0 0.0
80009182 44405 16.0 0.0
80008894 44406 32.0 0.0
80008115 44407 3.0 0.0
80008974 44409 16.0 0.0
80008380 44411 4.0 0.0
dr_update.dtypes
lager_nr int64
menge_im_lager float64
ArtMengen1 float64
dtype: object
如果我理解正确的话,首先你希望不匹配的索引在你的最终数据集中,你希望你的最终数据集是整数。您可以对数据集使用 'outer' join 和 astype int。
所以,在加入时你可以这样做:
dr.join(grp1,how='outer').fillna(0).astype(int)
评论后编辑,索引是对象。
您的索引是字符串对象。您需要将这些转换为数字。使用
dr.index = pd.to_numeric(dr.index)
grp1.index = pd.to_numeric(grp1.index)
dr.sort_index()
grp1.sort_index()
然后尝试剩下的...
您可以过滤旧库存 'dr' 数据框以匹配已售出的库存,然后减去并返回到原始过滤数据框。
# Filter the old stock dataframe so that you have matching index to the sold dataframe.
# Restrict just for menge_im_lager. Then subtract the sold stock
dr.loc[dr.index.isin(grp1.index), "menge_im_lager"] = (
dr.loc[dr.index.isin(grp1.index), "menge_im_lager"] - grp1["ArtMengen1"]
)
以下代码将根据索引更新库存商品数量。旧库存的 table dr 持有 >1000 个值。更新后的数据框 grp1 包含已售商品的数量。我想从数据帧 dr 中减去数据帧 grp1 并更新 dr。一切都很好,直到我想加入 grp1 与 Panda 的 join 和 fillna。首先,数据类型从 int 更改为 float,不仅 NaN,notnull 值也被替换为 0。这是索引不匹配的问题吗?
我试图使数据类型统一,但这并没有改变任何东西。在加入两个数据帧时删除 fillna returns 所有列的 NaN。
dr has the following format (example):
druck_pseudonym lager_nr menge_im_lager
80009359 62808 1
80009360 62809 10
80009095 62810 0
80009364 62811 11
80009365 62812 10
80008572 62814 10
80009072 62816 18
80009064 62817 13
80009061 62818 2
80008725 62819 3
80008940 62820 12
dr.dtypes
lager_nr int64
menge_im_lager int64
dtype: object
and grp1 (example):
LagerArtikelNummer1 ArtMengen1
880211066 1
80211070 1
80211072 2
80211073 2
80211082 2
80211087 4
80211091 1
80211107 2
88889272 1
88889396 1
ArtMengen1 int64
dtype: object
#update list with "nicht_erledigt"
dr_update = dr.join(grp1).fillna(0)
dr_update["menge_im_lager"] = dr_update["menge_im_lager"] - dr_update["ArtMengen1"]
这个returns:
lager_nr menge_im_lager ArtMengen1
druck_pseudonym
80009185 44402 26.0 0.0
80009184 44403 2.0 0.0
80009182 44405 16.0 0.0
80008894 44406 32.0 0.0
80008115 44407 3.0 0.0
80008974 44409 16.0 0.0
80008380 44411 4.0 0.0
dr_update.dtypes
lager_nr int64
menge_im_lager float64
ArtMengen1 float64
dtype: object
如果我理解正确的话,首先你希望不匹配的索引在你的最终数据集中,你希望你的最终数据集是整数。您可以对数据集使用 'outer' join 和 astype int。 所以,在加入时你可以这样做:
dr.join(grp1,how='outer').fillna(0).astype(int)
评论后编辑,索引是对象。
您的索引是字符串对象。您需要将这些转换为数字。使用
dr.index = pd.to_numeric(dr.index)
grp1.index = pd.to_numeric(grp1.index)
dr.sort_index()
grp1.sort_index()
然后尝试剩下的...
您可以过滤旧库存 'dr' 数据框以匹配已售出的库存,然后减去并返回到原始过滤数据框。
# Filter the old stock dataframe so that you have matching index to the sold dataframe.
# Restrict just for menge_im_lager. Then subtract the sold stock
dr.loc[dr.index.isin(grp1.index), "menge_im_lager"] = (
dr.loc[dr.index.isin(grp1.index), "menge_im_lager"] - grp1["ArtMengen1"]
)