两个数据帧的Pandas join.fillna将所有值替换为anf而不仅仅是nan

2024-07-05 12:13:34 发布

您现在位置:Python中文网/ 问答频道 /正文

以下代码将根据索引更新库存中的项目数。旧股票持有的表dr>;1000个值。更新后的数据框grp1包含已售出商品的数量。我想从数据帧dr中减去数据帧grp1并更新dr。在我想用Panda的join和fillna将grp1连接到dr之前,一切都很好。首先,数据类型从int变为float,不仅NaN值,notnull值也被0替换。这是索引不匹配的问题吗

我试图使数据类型统一,但这没有改变任何事情。在连接两个数据帧时删除fillna会为所有列返回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"]

这将返回:


                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

Tags: 数据objectupdatenr数据类型joindtypeim
2条回答

在注释后编辑,索引是对象。

索引是字符串对象。你需要把它们转换成数字。使用

dr.index = pd.to_numeric(dr.index) 
grp1.index = pd.to_numeric(grp1.index)

dr.sort_index()
grp1.sort_index()

那就试试剩下的

您可以过滤旧的stock“dr”数据帧以匹配售出的stock,然后减去,并分配回原始过滤的数据帧

# 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"]
)

如果我理解正确,首先您希望非匹配索引位于最终数据集中,并且希望最终数据集中是整数。可以对数据集使用'outer'联接和astype int。 因此,在连接处,您可以这样做:

dr.join(grp1,how='outer').fillna(0).astype(int)

相关问题 更多 >