Python 尝试使用str.contains和boolean掩码,但仅用于Pandas中单个值的两个实例
如果任何一行在Yurt列中只包含两个“–”实例,我要做的是保持所有行具有相同的唯一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
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