Pandas 计算 2 列中的值对,条件在第三列
Pandas counting pairs of values from 2 columns with condition on the third
我有一个包含三列的数据集:用户名、计算机、Success/Failure。
我想统计有多少个相似的Username+Computer 对,其中第三列是Success。
我希望结果是一个包含 1 列的数据集,如果原始数据集中的第三列是 Failure,则结果中的同一列将包含 0。
结果 table 必须包含与原始 table.
相同的行数
例如:
原始数据集:
User
Computer
Success or Failure
admin
DC
Success
admin
DC
Success
admin
DC
Fail
admin
Server
Success
admin
Server
Fail
User
Computer
Success
User
Computer
Success
User
Computer
Fail
结果:
No
Count
1
2
2
2
3
0
4
1
5
0
6
2
7
2
8
0
所有失败的行都不计算在内,在结果中用0填充。
我正在使用 pandas 在 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)
尝试:
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
首先创建一个布尔掩码来查找值为 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
我有一个包含三列的数据集:用户名、计算机、Success/Failure。
我想统计有多少个相似的Username+Computer 对,其中第三列是Success。 我希望结果是一个包含 1 列的数据集,如果原始数据集中的第三列是 Failure,则结果中的同一列将包含 0。 结果 table 必须包含与原始 table.
相同的行数例如:
原始数据集:
User | Computer | Success or Failure |
---|---|---|
admin | DC | Success |
admin | DC | Success |
admin | DC | Fail |
admin | Server | Success |
admin | Server | Fail |
User | Computer | Success |
User | Computer | Success |
User | Computer | Fail |
结果:
No | Count |
---|---|
1 | 2 |
2 | 2 |
3 | 0 |
4 | 1 |
5 | 0 |
6 | 2 |
7 | 2 |
8 | 0 |
所有失败的行都不计算在内,在结果中用0填充。
我正在使用 pandas 在 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)
尝试:
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
首先创建一个布尔掩码来查找值为 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