我有一个包含20K多行的示例pandas.DataFrame
,格式如下:
import pandas as pd
import numpy as np
data = {"first_column": ["A", "B", "B", "B", "C", "A", "A", "A", "D", "B", "A", "A"],
"second_column": [0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0]}
df = pd.DataFrame(data)
>>> df
first_column second_column
0 A 0
1 B 1
2 B 1
3 B 1
4 C 0
5 A 0
6 A 0
7 A 1
8 D 1
9 B 1
10 A 1
11 A 0
....
每行中的第一列first_column
包含A
、B
、C
和D
。在第二列中,有一个二进制标签表示一组值。所有连续的1的分组都是唯一的“组”,例如,第1-3行是一组,第7-10行是另一组。
我想通过将它们标记为“AB”(该组仅由A或B组成)、“CD”(该组仅由C或D组成)或“混合”(如果存在混合,例如全部为B和一个C)。还有一个有用的信息是要知道这些分组的“混合程度”,即AB的百分比,即(# AB行数)/(总行数)。
下面是结果DataFrame
的样式:
>>> df
first_column second_column identity percent
0 A 0 0 0
1 B 1 AB 1.0
2 B 1 AB 1.0
3 B 1 AB 1.0
4 C 0 0 0
5 A 0 0 0
6 A 0 0 0
7 A 1 mixed 0.75 # 3/4, 3-AB, 4-total
8 D 1 mixed 0.75
9 B 1 mixed 0.75
10 A 1 mixed 0.75
11 A 0 0 0
....
我的初步想法是首先尝试使用df.loc()
。
if (df.first_column == "A" | df.first_column == "B"):
df.loc[df.second_column == 1, "identity"] = "AB"
if (df.first_column == "C" | df.first_column == "D"):
df.loc[df.second_column == 1, "identity"] = "CD"
但是这并没有考虑到混合物,也不能处理独立分组。