簡體   English   中英

在python中完成系列(數據框)

[英]complete the series(data frame) in python

我有這樣的數據集。 我想像輸出中描述的那樣填充這個數據框。 基本上缺失的系列值將填充為零

 Date Opened     Part Number  NCe
0   2019-01-14    partA       1
1   2019-01-21    PartB       2
2   2019-01-21    PartC       1
3   2019-01-28    PartB       3

輸出:

  Date Opened    Part Number  NCe
 2019-01-14      partA       1
 2019-01-14      PartB       0
 2019-01-14      PartC       0
 2019-01-21      PartA       0
 2019-01-21      PartB       2
 2019-01-21      PartC       1
 2019-01-28      PartA       0
 2019-01-28      PartB       3
 2019-01-28      PartC       0

假設您已經在名為“df”的變量中定義了數據框,您可以在下面檢查是否有幫助:-

  1. 首先,我創建了一個骨架數據框,它結合了數據框兩列中的所有元素。
  2. 接下來,我只是按照骨架數據幀構成最終輸出的基礎的順序加入這些數據幀。 只需使用 .fillna() 用“0”填充 NaN 值。

    dates = df.Date_Opened.unique().tolist()

    parts = df.Part_Number.unique().tolist()

    index = pd.MultiIndex.from_product([dates, parts], names = ["Date_Opened", "Part_Number"])

    skeleton_df = pd.DataFrame(index = index).reset_index()

    final_df = pd.merge(skeleton_df, df, on=['Date_Opened','Part_Number'], how ='left').fillna(0)

輸出

  Date_Opened Part_Number  NCe
0  2019-01-14       partA  1.0
1  2019-01-14       PartB  0.0
2  2019-01-14       PartC  0.0
3  2019-01-21       partA  0.0
4  2019-01-21       PartB  2.0
5  2019-01-21       PartC  1.0
6  2019-01-28       partA  0.0
7  2019-01-28       PartB  3.0
8  2019-01-28       PartC  0.0

注意:-肯定有更好的解決方法,我會發布更新,因為我可以測試另一個。

假設您的原始數據reset_indexdf ,您應該首先使用crosstabreset_index來構建預期行的完整列表:

df2 = pd.DataFrame(pd.crosstab(df['Date Opened'], df['Part Number']
                    ).stack()).reset_index()[['Date Opened', 'Part Number']]

它給:

  Date Opened Part Number
0  2019-01-14       PartB
1  2019-01-14       PartC
2  2019-01-14       partA
3  2019-01-21       PartB
4  2019-01-21       PartC
5  2019-01-21       partA
6  2019-01-28       PartB
7  2019-01-28       PartC
8  2019-01-28       partA

它的排序不正確,因為小寫的p在整理順序中排在大寫的P之后。 您可以通過使用部件號的最后一個字符進行排序來修復它:

df2 = df2.assign(ix=df2['Part Number'].str[-1]).sort_values(['Date Opened', 'ix']
                               )[['Date Opened', 'Part Number']].reset_index(drop=True)

您現在可以合並原始值,用 0 填充缺失的值並轉換回 int:

df2.merge(df, how='left', on = ['Date Opened', 'Part Number']).fillna(0).astype({'NCe': int})

要得到:

  Date Opened Part Number  NCe
0  2019-01-14       partA    1
1  2019-01-14       PartB    0
2  2019-01-14       PartC    0
3  2019-01-21       partA    0
4  2019-01-21       PartB    2
5  2019-01-21       PartC    1
6  2019-01-28       partA    0
7  2019-01-28       PartB    3
8  2019-01-28       PartC    0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM