Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 尝试使用str.contains和boolean掩码,但仅用于Pandas中单个值的两个实例_Python_String_Pandas_Boolean_Pandas Groupby - Fatal编程技术网

Python 尝试使用str.contains和boolean掩码,但仅用于Pandas中单个值的两个实例

Python 尝试使用str.contains和boolean掩码,但仅用于Pandas中单个值的两个实例,python,string,pandas,boolean,pandas-groupby,Python,String,Pandas,Boolean,Pandas Groupby,如果任何一行在Yurt列中只包含两个“–”实例,我要做的是保持所有行具有相同的唯一ID 我正在考虑使用str.contains和布尔掩码,方法如下: df[df['ID'].isin(df.loc[df.Yurt.str.contains('-'), 'ID'].unique())] …但不确定如何只保留只有两个实例且没有值的行 示例df: ID % Yurt abc123 0.833 Bodega abc123 0.87 - abc123 0.867

如果任何一行在Yurt列中只包含两个“–”实例,我要做的是保持所有行具有相同的唯一
ID

我正在考虑使用
str.contains
和布尔掩码,方法如下:

df[df['ID'].isin(df.loc[df.Yurt.str.contains('-'), 'ID'].unique())]
…但不确定如何只保留只有两个实例且没有值的行

示例df:

ID      %       Yurt
abc123  0.833   Bodega
abc123  0.87    -
abc123  0.867   -
abc123  0.812   -
lmn789  0.837   Mickey's
lmn789  0.856   Chopped Cheese
lmn789  0.813   -
lmn789  0.812   -
xyz456  0.111   -
xyz456  0.222   -
xyz456  0.333   -
xyz456  0.444   -
结果df:

ID      %       Yurt
lmn789  0.837   Mickey's
lmn789  0.856   Chopped Cheese
lmn789  0.813   -
lmn789  0.812   -

在“ID”列上执行
groupby
,并使用:

输出:

       ID      %            Yurt
4  lmn789  0.837        Mickey's
5  lmn789  0.856  Chopped Cheese
6  lmn789  0.813               -
7  lmn789  0.812               -

您可以使用
GroupBy.size
计算范围内的值,然后过滤原始数据帧

nulls = df[df['Yurt'] == '-'].groupby('ID').size()

df = df[df['ID'].isin(nulls[nulls == 2].index)]

print(df)

       ID      %           Yurt
4  lmn789  0.837       Mickey's
5  lmn789  0.856  ChoppedCheese
6  lmn789  0.813              -
7  lmn789  0.812              -
您可能会发现这比自定义
lambda
函数更有效:

def jpp(df):
    nulls = df[df['Yurt'] == '-'].groupby('ID').size()
    return df[df['ID'].isin(nulls[nulls == 2].index)]

def root(df):
    return df.groupby('ID').filter(lambda grp: grp['Yurt'].eq('-').sum() == 2)

%timeit jpp(df)   # 2.99 ms per loop
%timeit root(df)  # 4.93 ms per loop
def jpp(df):
    nulls = df[df['Yurt'] == '-'].groupby('ID').size()
    return df[df['ID'].isin(nulls[nulls == 2].index)]

def root(df):
    return df.groupby('ID').filter(lambda grp: grp['Yurt'].eq('-').sum() == 2)

%timeit jpp(df)   # 2.99 ms per loop
%timeit root(df)  # 4.93 ms per loop