PythonPandas:统计后续值的数量,满足条件时赋名

cwtwac6a  于 2022-12-28  发布在  Python
关注(0)|答案(4)|浏览(162)

例如,我创建了这个数据框:

import pandas as pd

df = pd.DataFrame({'Cycle': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
                             2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
                             4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]})

#Maybe something like this: df['Cycle Type'] = df['Cycle'].rolling(2).apply(lambda x: len(set(x)) != len(x),raw= True).replace({0 : False, 1: True})

我想计算值的数量,然后给它分配一种类型的循环。如果循环少于12行或多于100行,则将其标记为坏,否则将其标记为好。我想使用类似lambda函数的东西来检查前一行的值是否相同,但我不确定如何添加计数功能来为它提供我想要的参数。

dgenwo3n

dgenwo3n1#

首先计算pandas.DataFrame.groupbypandas.DataFrame.transformpandas.DataFrame.count的每组中的行数,如下所示

df["cycle_quality"] = df.groupby("Cycle")["Cycle"].transform("count")

然后使用pandas.DataFrame.apply对其应用质量函数:
·如果行数小于12且大于100,则将cycle_quality定义为bad
·否则,cycle_quality应为good

df["cycle_quality"] = df.apply(lambda x: "bad" if x["cycle_quality"] < 12 or x["cycle_quality"] > 100 else "good", axis=1)

[Out]:
    Cycle cycle_quality
0       0          good
1       0          good
2       0          good
3       0          good
4       0          good
..    ...           ...
71      5           bad
72      5           bad
73      5           bad
74      5           bad
75      5           bad
ix0qys7i

ix0qys7i2#

使用groupbytransform获取每个周期的大小,使用between查看每个周期的大小是否在13和100之间(包括13和100),并将True标记为良好,False标记为不良。因为根据要求,任何小于12且大于100的大小都是不良的,而在[13,100]之间的所有大小都是良好的。

df['Cycle_Type'] = df.groupby('Cycle')['Cycle'].transform('size').between(13, 100,
        inclusive='both').replace({True: 'good', False: 'bad'})

输出:

Cycle Cycle_Type
0       0        bad
1       0        bad
2       0        bad
3       0        bad
4       0        bad
..    ...        ...
71      5        bad
72      5        bad
73      5        bad
74      5        bad
75      5        bad

编辑:
您可以根据需要更改要标记为"良好"或"不良"的间隔。如果您的要求是少于12个应标记为"良好",则在间隔中包括12个,如下所示:

df['Cycle_Type'] = df.groupby('Cycle')['Cycle'].transform('size').between(12, 100,
            inclusive='both').replace({True: 'good', False: 'bad'})

那么您的输出为:

Cycle Cycle_Type
0       0       good
1       0       good
2       0       good
3       0       good
4       0       good
..    ...        ...
71      5        bad
72      5        bad
73      5        bad
74      5        bad
75      5        bad
ki1q1bka

ki1q1bka3#

另一种实现方法是:

  • 使用pd.Series.value_counts获取df['Cycle']中所有唯一值的计数。
  • 接下来,应用pd.Series.between以获得一个布尔值序列。
  • 在将其传递给应用于列Cyclepd.Series.map之前,我们将该数列转换为具有replace'good'|'bad'
import pandas as pd

df = pd.DataFrame({'Cycle': [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5]})

vc = df.Cycle.value_counts()

df['Cycle_Type'] = df['Cycle'].map(
    vc.between(12,100,inclusive='both').replace({True: 'good', False: 'bad'}))

# printing output per value
print(df.groupby('Cycle', as_index=False).first())

   Cycle Cycle_Type
0      0       good
1      1        bad
2      2       good
3      3       good
4      4       good
5      5        bad
snvhrwxg

snvhrwxg4#

这是一种使用pd.cut()的方法。如果需要应用比好和坏更多的类别,这可能会很有用。

(df['Cycle']
.map(
    pd.cut(df['Cycle'].value_counts(),
    bins = [0,12,100,np.inf],
    right = False,
    labels = ['bad','good','bad'],
    ordered=False)))

s = df['Cycle'].diff().ne(0).cumsum()
np.where(s.groupby(s).transform('count').between(12,100),'good','bad')

输出:

0     good
1     good
2     good
3     good
4     good
      ... 
71     bad
72     bad
73     bad
74     bad
75     bad

相关问题