在熊猫中,我想分析是否存在一个条件值的组。我提供了一个示例数据框,并在下面尝试了确定此类组的第一步。因此,比方说,在下面的数据框中,我只想过滤原始萼片长度大于6的虹膜物种的原始数据帧。在最后一条命令中,我要对唯一物种组的数量进行计数的萼片长度大于6(因此,至少我能数出它们)。
但是,我真正想要的是原始数据框,其中仅当物种的萼片长度大于6时才分析行(因此,这将是没有物种“ setosa”的数据框,因为它们永远都没有)。 / p>
更长的解释是我有一个真实的用户数据集。每个用户在某些列中的值可能会超过感兴趣的阈值。我还没有弄清楚如何分析具有这些阈值的用户。
也许循环会更好。我可能会遍历每个唯一的用户名,并查看该用户的任何行是否超过某个值并获得某种新列(尽管我知道熊猫中不赞成使用循环,所以我在这里发布以查看是否存在某种类型出现的识别组的方法)
谢谢,让我知道我是否能使这个问题更清楚!
import pandas as pd
import seaborn as sns
import numpy as np
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
iris = sns.load_dataset('iris')
iris['longsepal'] = iris['sepal_length'] > 7
iris['longpetal'] = iris['petal_length'] > 5
iris.groupby(['longsepal'])['species'].nunique()
答案 0 :(得分:3)
请考虑groupby().transform()
来计算内联max
,然后根据种类对其值进行过滤。从技术上讲,> 7
仅在veriscolor
最大值达到7.0
时返回一个物种。下面显示了不等式逻辑的运算符和函数形式。
iris['longsepal'] = iris.groupby(['species'])['sepal_length'].transform('max')
iris['longpetal'] = iris.groupby(['species'])['petal_length'].transform('max')
# DATA FILTERS
longsepal_iris = iris.loc[iris['longsepal'] > 7] # GREATER THAN OPERATOR FORM: >
longsepal_iris = iris.loc[iris['longsepal'].gt(7)] # GREATER THAN FUNCTIONAL FORM: gt()
longpetal_iris = iris.loc[iris['longpetal'] > 5] # GREATER THAN OPERATOR FORM: >
longpetal_iris = iris.loc[iris['longpetal'].gt(5)] # GREATER THAN FUNCTIONAL FORM: gt()
# SPECIES
longsepal_iris['species'].unique()
# ['virginica']
longpetal_iris['species'].unique()
# ['versicolor' 'virginica']