我有帶有 NaN 和值的資料框,現在我想比較同一資料框中的兩列,無論每一行的值是否為空。舉些例子,
- 如果 a_1 列有空值,a_2 列沒有空值,則對于該特定行,新列 a_12 中的結果應為 1。
- 如果 a_1(value is 123) & a_2(value is 345) 中的值都不為空,并且值不相等,則 a_12 列中的結果應為 3。
下面是我用來比較的代碼片段,對于場景 1,我得到的結果是 3 而不是 1。請指導我獲得正確的輸出。
try:
if (x[cols[0]]==x[cols[1]]) & (~np.isnan(x[cols[0]])) & (~np.isnan(x[cols[1]])):
return 0
elif (np.isnan(x[cols[0]])) & (np.isnan(x[cols[1]])):
return 0
elif (~np.isnan(x[cols[0]])) & (np.isnan(x[cols[1]])):
return 1
elif (np.isnan(x[cols[0]])) & (~np.isnan(x[cols[1]])):
return 2
elif (x[cols[0]]!=x[cols[1]]) & (~np.isnan(x[cols[0]])) & (~np.isnan(x[cols[1]])):
return 3
else:
pass
except Exception as exc:
if (x[cols[0]]==x[cols[1]]) & (pd.notna(x[cols[0]])) & (pd.notna(x[cols[1]])):
return 0
elif (pd.isna(x[cols[0]])) & (pd.isna(x[cols[1]])):
return 0
elif (pd.notna(x[cols[0]])) & (pd.isna(x[cols[1]])):
return 1
elif (pd.isna(x[cols[0]])) & (pd.notna(x[cols[1]])):
return 2
elif (x[cols[0]]!=x[cols[1]]) & (pd.notna(x[cols[0]])) & (pd.notna(x[cols[1]])):
return 3
else:
pass
我使用了 pd.isna() 和 pd.notna(),也使用了 np.isnan() 和 ~np.isnan(),因為對于某些列,第二種方法 (np.isnan()) 有效,對于某些列只是拋出一個錯誤。
請指導我實作例外的結果。
預期輸出:
| a_1 | a_2 | result |
|-----------|---------|--------|
| gssfwe | gssfwe | 0 |
| <NA> | <NA> | 0 |
| fsfsfw | <NA> | 1 |
| <NA> | qweweqw | 2 |
| adsadgsgd | wwuwquq | 3 |
輸出得到上面的代碼:
| a_1 | a_2 | result |
|-----------|---------|--------|
| gssfwe | gssfwe | 0 |
| <NA> | <NA> | 0 |
| fsfsfw | <NA> | 3 |
| <NA> | qweweqw | 3 |
| adsadgsgd | wwuwquq | 3 |
uj5u.com熱心網友回復:
按照代碼中的邏輯,您需要定義一個函式并將其應用于您的DataFrame
.
df = pd.DataFrame({'a_1': [1, 2, np.nan, np.nan, 1], 'a_2': [2, np.nan, 1, np.nan, 1]})
您希望將類別巧妙地映射到二進制數,您可以使用它來撰寫一個簡短的函式,例如 -
def nan_check(row):
x, y = row
if x != y:
return int(f'{int(pd.notna(y))}{int(pd.notna(x))}', base=2)
return 0
df['flag'] = df.apply(nan_check, axis=1)
輸出
a_1 a_2 flag
0 1.0 2.0 3
1 2.0 NaN 1
2 NaN 1.0 2
3 NaN NaN 0
4 1.0 1.0 0
uj5u.com熱心網友回復:
您可以嘗試np.select
,但我認為您需要重新考慮條件和預期輸出
條件1:如果列
a_1
有空值,列a_2
沒有空值,那么對于該特定行,結果應該1
在新列a_12
中。條件 2:如果
a_1
&中的值a_2
都不為空,并且值不相等,那么結果應該3
在 column 中a_12
。
df['a_12'] = np.select(
[df['a_1'].isna() & df['a_2'].notna(),
df['a_1'].notna() & df['a_2'].notna() & df['a_1'].ne(df['a_2'])],
[1, 3],
default=0
)
print(df)
a_1 a_2 result a_12
0 gssfwe gssfwe 0 0
1 NaN NaN 0 0
2 fsfsfw NaN 1 0 # Shouldn't be Condition 1 since a_1 is not NaN
3 NaN qweweqw 2 1 # Condition 1
4 adsadgsgd wwuwquq 3 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/485524.html
標籤:python-3.x 熊猫 数据框 楠 呐