我有一個包含三列的資料集:用戶名、計算機、成功/失敗。
我想計算有多少相似的用戶名 計算機對,第三列是成功。我希望結果是具有 1 列的資料集,如果原始資料集中的第三列是失敗,則結果中的同一列將包含 0。結果表必須包含與原始表相同數量的行。
例如:
原始資料集:
| 用戶 | 計算機 | 成功或失敗 |
|---|---|---|
| 行政 | 直流 | 成功 |
| 行政 | 直流 | 成功 |
| 行政 | 直流 | 失敗 |
| 行政 | 服務器 | 成功 |
| 行政 | 服務器 | 失敗 |
| 用戶 | 計算機 | 成功 |
| 用戶 | 計算機 | 成功 |
| 用戶 | 計算機 | 失敗 |
結果:
| 不 | 數數 |
|---|---|
| 1 | 2 |
| 2 | 2 |
| 3 | 0 |
| 4 | 1 |
| 5 | 0 |
| 6 | 2 |
| 7 | 2 |
| 8 | 0 |
不計算所有失敗的行,它們在結果中填充為 0。
我正在使用熊貓在 python 中編程。我可以使用 tolist() 方法執行此操作,然后使用簡單的 for 回圈和條件創建一個新串列,但我正在尋找一種使用 pandas 內置方法來節省記憶體和時間的方法。
非常感謝!
下面是使用 tolist 方法的代碼:
result = [user_and_computer = [list(x) for x in list(zip(df["user"].tolist(),df["computer"].tolist(),df["is_success"].tolist()))]
for logon in user_and computer:
if is_success:
result.append(user_and_computer.count(logon))
else:
result.append(0)
uj5u.com熱心網友回復:
首先創建一個布爾掩碼以查找值所在的行Success,然后將此掩碼與User和Computer列一起分組,并用總和進行轉換以獲得結果
m = df['Success or Failure'].eq('Success')
df['count'] = m.groupby([df['User'], df['Computer'], m]).transform('sum')
User Computer Success or Failure count
0 admin DC Success 2
1 admin DC Success 2
2 admin DC Fail 0
3 admin Server Success 1
4 admin Server Fail 0
5 User Computer Success 2
6 User Computer Success 2
7 User Computer Fail 0
uj5u.com熱心網友回復:
嘗試:
df["Count"] = df.groupby(["User", "Computer"])["Success or Failure"].transform(
lambda x: x.eq("Success").sum()
)
df.loc[df["Success or Failure"] != "Success", "Count"] = 0
print(df)
印刷:
User Computer Success or Failure Count
0 admin DC Success 2
1 admin DC Success 2
2 admin DC Fail 0
3 admin Server Success 1
4 admin Server Fail 0
5 User Computer Success 2
6 User Computer Success 2
7 User Computer Fail 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/452145.html
