我有这样的例子pandas.DataFrame
与+ 20K行创建标签的新列,在下面的表格:大熊猫据帧:基于其他列
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的百分比超出总标签的百分比也是有用的。所以,如果它只是A
或B
,身份应该是AB
。如果它只是C
或D
,身份应为CD
。它是A,B,C和/或D的混合物,那么它是mixed
。百分比(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"
但这不考虑混合物,也不适用于孤立的分组。
我不明白怎么算混合 - 您可以根据数学公式解释一下吗? – Edward
@爱德华对不起。如果它只有A或B,那么'identity'应该是'AB'。如果只有C或D,那么'identity'应该是'CD'。它是A,B,C和/或D的混合物,然后混合。这个百分比是'(AB行数量)/(总行数量)' – ShanZhengYang