為解決我的問題找了整整一天,也沒有找到答案。我試圖按照這個主題的例子來做。在pandas資料框架中獲取列名,其值為某物。 來制作一個具有多種條件的版本。
我想提取列名(在一個串列下)where :
value == 4 or/and value == 3
只有當沒有4或/和3時,才提取value==2的列名
例子:
data = {'Name'/span>: ['Tom'/span>, 'Joseph'/span>, 'Krish'/span>, 'John'/span>], 'acne'/span>: [1, 4, 1, 2], '皺紋'/span>: [1, 3, 4, 4],'darkpot'/span>: [2, 2, 3, 4] }
df1 = pd.DataFrame(data)
df1
df1
'''
Name acne wrinkles darkspot
0 湯姆 1 1 2
1 Joseph 4 3 2
2 Krish 1 4 3
3 John 2 4 4
''
我正在尋找的結果 :
df2
Name acne wrinkles darkspot problem
0 湯姆 1 1 2 [darkpot]
1 Joseph 4 3 2 [痤瘡、皺紋]
2 Krish 1 4 3 [皺紋、黑斑] 。
3 John 2 4 4 [皺紋,darkspot]
''
我試著用我上面提到的話題中詳述的帶有lambda的apply函式,但它只能接受一個引數。 如果有人能幫助我的話,非常感謝你們的回答:)
uj5u.com熱心網友回復:
你可以使用布爾掩碼:
problems = ['acne', 'wrinkles', 'darkspot']
m1 = df1[problem].isin([3, 4]) # 主條件
m2 = df1[問題].eq(2) # 后備條件。
mask = m1 | (m1.loc[~m1.any(axis=1) ] | m2)
df1['problem'] = mask.mul(problem).apply(lambda x: [i for i in x if i], axis=1)
輸出:
>>> df1
名稱 粉刺 皺紋 斑點問題
0 湯姆 1 1 2 [darkspot]
1 Joseph 4 3 2 [痤瘡、皺紋]
2 Krish 1 4 3 [皺紋、黑斑] 。
3 John 2 4 4 [皺紋,darkspot]
uj5u.com熱心網友回復:
你可以使用一個布爾掩碼來找出你需要的列。
首先檢查是否有任何值是3或4,如果不是,則檢查是否有任何值是2。在這兩個條件之間用|(or)形成復合掩碼(下面的變數m)。
最后,你可以NaN假值,這樣,當你堆疊和groupby.agg(list)時,你就只剩下真值的列標簽了。
cols = ['acne', 'wrinkles', 'darkpot']
m1 = df1[cols].isin([3, 4] )
# 如果行上沒有`3`或`4`,檢查是否有`2`。
m2 = pd.DataFrame((~m1.any(1)。 to_numpy()[:, None] & df1[cols].eq(2).to_numpy(),
index=m1.index, columns=m1.columns)
m = (m1 | m2)
#痤瘡皺紋darkspot。
#0 False False True。
#1 真 真偽假 #1 真 真偽假
#2 False False True True #2 False True True
#3 False True True[/span]。
# Assignment aligns on original DataFrame index, i. `'level_0'`
df1['problem'] = m.where(m).stack().reset_index().groupby('level_0')['level_1']. agg(list)
print(df1)
名稱痤瘡皺紋暗斑問題
0 Tom 1 1 2 [darkpot]
1 Joseph 4 3 2 [痤瘡、皺紋]
2 Krish 1 4 3 [皺紋,黑斑] 。
3 John 2 4 4 [皺紋,darkspot]
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/323983.html
標籤:
