【问题标题】:Pandas join.fillna of two data frames replaces all all values with anf not only nan两个数据框的 Pandas join.fillna 将所有值替换为,而不仅仅是 nan
【发布时间】:2020-01-04 20:46:23
【问题描述】:

以下代码将根据索引更新库存商品的数量。带有旧库存的表 dr 拥有 >1000 个值。更新后的数据框 grp1 包含已售商品的数量。我想从数据帧 dr 中减去数据帧 grp1 并更新 dr。一切都很好,直到我想通过 Panda 的 join 和 fillna 加入 grp1 博士。首先将数据类型从 int 更改为 float,不仅 NaN,而且 notnull 值都被 0 替换。这是不匹配索引的问题吗?

我试图使 dtypes 统一,但这并没有改变任何东西。在连接两个数据框时删除 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

【问题讨论】:

    标签: python pandas join nan


    【解决方案1】:

    如果我理解正确,首先您希望不匹配的索引出现在您的最终数据集中,并且您希望最终数据集是整数。您可以对数据集使用“外部”连接和 astype int。 因此,在加入时,您可以这样做:

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

    【讨论】:

    • 这只会产生一个 nan 的数据框。
    【解决方案2】:

    评论后编辑,索引是对象。

    您的索引是字符串对象。您需要将这些转换为数字。使用

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

    【讨论】:

    • 不幸的是,这只会产生一系列 nan 和运行时警告 ase.py:3772: RuntimeWarning: '
    • 谢谢。我之前用 astype(int) 尝试过类似的东西,但对索引不起作用。所以我重置了索引,然后将其转换为整数。但是,您的解决方案无疑是优雅的。
    猜你喜欢
    • 1970-01-01
    • 2021-06-29
    • 2015-01-15
    • 1970-01-01
    • 2021-08-31
    • 2022-07-06
    • 2016-09-23
    • 2012-11-23
    • 1970-01-01
    相关资源
    最近更新 更多