我正在尝试返回列
中值发生更改的累积计数
次数。
因此,对于下面的 df
,我想返回 'Home'
更改为 'Away'
的运行次数,并且反之亦然。我不想返回某个值的显示次数。
import pandas as pd
d = ({
'Who' : ['Home','Away','','','Home','Away','Home','Home','Home','','Away','Home'],
})
df = pd.DataFrame(data = d)
我试过这个。
df['Home_count'] = (df['Who'] == 'Home').cumsum()
df['Away_count'] = (df['Who'] == 'Away').cumsum()
返回结果:
Who Home_count Away_count
0 Home 1 0
1 Away 1 1
2 1 1
3 1 1
4 Home 2 1
5 Away 2 2
6 Home 3 2
7 Home 4 2
8 Home 5 2
9 5 2
10 Away 5 3
11 Home 6 3
但我正在尝试计算它改变的次数。不是每个值的总数。因此,如果显示为“Home、Home、Home、Away”,则“Away”旁边应该只有一个计数。不是1、2、3对阵主场。
Home 1 #Theres a change so provide a count
Home #No change so no count
Home #No change so no count
Away 1 #Theres a change so provide a count
Home 2 #Theres a change so provide a count
请参阅预期输出:
预期输出:
Count_Away Count_Home Who
0 1 Home
1 1 Away
2
3
4 2 Home
5 2 Away
6 3 Home
7 Home
8 Home
9
10 3 Away
11 4 Home
最佳答案
- 使用
pd.get_dummies
获取 one-hot 编码的 DataFrame - 使用
cumsum
计算累积和 - 通过将
v
与其移动后的版本进行比较来查找变化点 - 用空字符串填充 NaN
- 将结果与原始结果连接
v = pd.get_dummies(
df.where(df.Who.ne(df.Who.shift()) & df.Who.str.len().astype(bool)
), prefix='Count'
).cumsum()
df = pd.concat([
v.where(v.ne(v.shift())).fillna('', downcast='infer'), df
], axis=1
)
print(df)
Count_Away Count_Home Who
0 0 1 Home
1 1 Away
2
3
4 2 Home
5 2 Away
6 3 Home
7 Home
8 Home
9
10 3 Away
11 4 Home
关于python - pandas df 中两列之间的累积计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51034031/