Pandas 计算分组数据帧中连续相等值的长度
Pandas calculate length of consecutive equal values from a grouped dataframe
我想做他们在此处答案中所做的事情:
,但使用分组数据框而不是系列。
给定一个包含多列的数据框
A B C
------------
x x 0
x x 5
x x 2
x x 0
x x 0
x x 3
x x 0
y x 1
y x 10
y x 0
y x 5
y x 0
y x 0
我想对 A 列和 B 列进行分组,然后计算 C 中连续零的数量。之后我想 return 计算每个长度的零出现的次数。所以我想要这样的输出:
A B num_consecutive_zeros count
---------------------------------------
x x 1 2
x x 2 1
y x 1 1
y x 2 1
我不知道如何调整链接问题的答案来处理分组数据帧。
这是代码,count_consecutive_zeros()
使用 numpy 函数和 pandas.value_counts()
获取结果,并使用 groupby().apply(count_consecutive_zeros)
为每个组调用 count_consecutive_zeros()
。调用 reset_index()
将 MultiIndex
更改为列:
import pandas as pd
import numpy as np
from io import BytesIO
text = """A B C
x x 0
x x 5
x x 2
x x 0
x x 0
x x 3
x x 0
y x 1
y x 10
y x 0
y x 5
y x 0
y x 0"""
df = pd.read_csv(BytesIO(text.encode()), delim_whitespace=True)
def count_consecutive_zeros(s):
v = np.diff(np.r_[0, s.values==0, 0])
s = pd.value_counts(np.where(v == -1)[0] - np.where(v == 1)[0])
s.index.name = "num_consecutive_zeros"
s.name = "count"
return s
df.groupby(["A", "B"]).C.apply(count_consecutive_zeros).reset_index()
我想做他们在此处答案中所做的事情:
给定一个包含多列的数据框
A B C
------------
x x 0
x x 5
x x 2
x x 0
x x 0
x x 3
x x 0
y x 1
y x 10
y x 0
y x 5
y x 0
y x 0
我想对 A 列和 B 列进行分组,然后计算 C 中连续零的数量。之后我想 return 计算每个长度的零出现的次数。所以我想要这样的输出:
A B num_consecutive_zeros count
---------------------------------------
x x 1 2
x x 2 1
y x 1 1
y x 2 1
我不知道如何调整链接问题的答案来处理分组数据帧。
这是代码,count_consecutive_zeros()
使用 numpy 函数和 pandas.value_counts()
获取结果,并使用 groupby().apply(count_consecutive_zeros)
为每个组调用 count_consecutive_zeros()
。调用 reset_index()
将 MultiIndex
更改为列:
import pandas as pd
import numpy as np
from io import BytesIO
text = """A B C
x x 0
x x 5
x x 2
x x 0
x x 0
x x 3
x x 0
y x 1
y x 10
y x 0
y x 5
y x 0
y x 0"""
df = pd.read_csv(BytesIO(text.encode()), delim_whitespace=True)
def count_consecutive_zeros(s):
v = np.diff(np.r_[0, s.values==0, 0])
s = pd.value_counts(np.where(v == -1)[0] - np.where(v == 1)[0])
s.index.name = "num_consecutive_zeros"
s.name = "count"
return s
df.groupby(["A", "B"]).C.apply(count_consecutive_zeros).reset_index()