我有一個資料框架
df = pd. DataFrame({'Con_Num': [1, 1, 1, 2, 2, 2, 2, 3, 3】。]
'Con_Type': ['A'/span>, 'A'/span>, 'B'/span>, 'C'/span>, 'A'/span>, 'B', 'B', 'C', 'C', 'C'] 。
'Is_Prim': ['No','Yes','No','No'。 'No','No','Yes','No','Yes']})
Out[298]。
Con_Num Con_Type Is_Prim
0 1 A No
1 1 A Yes
2 1 B 否
3 1 C 否
4 2 A 沒有
5 2 B 否
6 2 B 否
7 2 C 有
8 3 C 否
9 3 C Yes
我想更新Con_Type列,所以每個組的值都是一樣的(基于Con_Num的分組)。我希望該列的值是Is_Prim=Yes的那一行。
我已經看到了轉換功能,但我沒有成功地弄清楚如何基于另一列進行映射。
我基于示例資料框架的輸出將如下:
我的輸出將如下:
Con_Num Con_Type Is_Prim
0 1 A No
1 1 A Yes
2 1 A 否
3 1 A 否
4 2 C 沒有
5 2 C 否
6 2 C 否
7 2 C 是
8 3 C 否
9 3 C Yes
我不想重復資料,還有其他我需要的列,但與這個問題無關。
uj5u.com熱心網友回復:
做一個groupby來獲取Is_Prim等于Yes的值,然后將結果映射回原始資料框架:
filtered = df.groupby([df.Is_Prim.eq('Yes'/span>), df.Con_Num]).Con_Type.first()
df.assign(Con_Type = df.Con_Num.map(filtered.xs(True))
Con_Num Con_Type Is_Prim
0 1 A No
1 1 A Yes
2 1 A 否
3 1 A 否
4 2 C 否
5 2 C 否
6 2 C 否
7 2 C 是
8 3 C 否
9 3 C Yes
另外,你可以直接過濾Is_Prim等于Yes的行(這里的假設是每個組有一個Yes,而且是單一的),然后做映射:
mapping = df.query('Is_Prim=="Yes"'/span>).set_index('Con_Num'/span>).Con_Type
df.assign(Con_Type = df.Con_Num.map(mapping))
Con_Num Con_Type Is_Prim
0 1 A No
1 1 A Yes
2 1 A 否
3 1 A 否
4 2 C 否
5 2 C 否
6 2 C 否
7 2 C 是
8 3 C 否
9 3 C Yes
uj5u.com熱心網友回復:
另一個使用.merge的解決方案:
x = df[["Con_Num", "Is_Prim"]].merge(
df.loc[df.loc[:, "Is_Prim"].eq("是"), ["Con_Num", "Con_Type"]
)
print(x)
列印:
Con_Num Is_Prim Con_Type
0 1 No A
1 1 是 A
2 1 無 A
3 1 無 A
4 2 無 C
5 2 無 C
6 2 無 C
7 2 有 C
8 3 否 C
9 3 是 C
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/307664.html
標籤:
上一篇:<p>我有一個視圖,根據認證的用戶顯示一個類別及其產品的選單,這意味著我只想顯示某些類別/產品,我的問題是在搜索欄中,當我輸入所有類別的產品時,我希望搜索只找到這些特定類別的產品。這就是為
