python-3.x 在特定条件下从 Dataframe 中提取特定组

klh5stk1  于 2023-06-07  发布在  Python
关注(0)|答案(2)|浏览(125)

我有一个DataFrame如下所示,我想提取包含一行的组(名称:J和年龄:33)
| X型|Y轴|姓名|年龄|
| - -----|- -----|- -----|- -----|
| 1| 3| J型|三十三|
| 1| 3|一个|四十七名|
| 1| 4| B|五十三|
| 1| 4| X型|二十二|
| 2| 3| J型|三十三|
| 2| 3|压力|八十|
| 2| 4| V|九十|
| 2| 4| V|九十三|
总的来说,它将产生下表,因为1,3X/Y组包含J,33,并且2,3X/Y组也包含J,33行。
| X型|Y轴|姓名|年龄|
| - -----|- -----|- -----|- -----|
| 1| 3| J型|三十三|
| 1| 3|一个|四十七名|
| 2| 3| J型|三十三|
| 2| 3|压力|八十|
我一直在通过迭代行来实现这一点,这太慢了,我想知道是否有一种更快的方法,即在Pandas中使用groupby和apply/pipe方法。任何帮助都很感激
以下实施例DF:

df = pd.DataFrame({
    'X': [1,1,1,1,2,2,2,2],
    'Y': [3,3,4,4,3,3,4,4],
    'Name': ['J', 'A', 'B', 'X', 'V', 'P', 'J', 'V'],
    'Age': [33,47,53,22,33,80,33,93]
})
btqmn9zl

btqmn9zl1#

一个选项是使用groupby:

# Get rows equal to ('J', 33)
check = df.loc(axis=1)[['Name','Age']].eq(('J', 33)).all(axis=1)
# run a groupby and get groups where True exists for any row in that group
check = check.groupby([df.X, df.Y]).transform('any')
#filter original dataframe
df.loc[check]

   X  Y Name  Age
0  1  3    J   33
1  1  3    A   47
4  2  3    J   33
5  2  3    P   80

另一个选项,仍然使用groupby:

group = df.groupby(['X','Y'])
cond1 = group.Name.transform(lambda x: any(x == 'J'))
cond2 = group.Age.transform(lambda x: any(x == 33))
df.loc[cond1 & cond2]
   X  Y Name  Age
0  1  3    J   33
1  1  3    A   47
4  2  3    J   33
5  2  3    P   80
jjhzyzn0

jjhzyzn02#

您可以搜索所有包含Name == JAge == 33的唯一XY值,然后过滤 Dataframe :

mask = (df['Name'] == 'J') & (df['Age'] == 33)

unique_x = df.loc[mask, 'X'].unique()
unique_y = df.loc[mask, 'Y'].unique()

print(df[df['X'].isin(unique_x) & df['Y'].isin(unique_y)])

图纸:

X  Y Name  Age
0  1  3    J   33
1  1  3    A   47
4  2  3    J   33
5  2  3    P   80

编辑:更新问题,没有.groupby的解决方案:

mask = (df['Name'] == 'J') & (df['Age'] == 33)

t = set(df.loc[mask, ['X', 'Y']].drop_duplicates().apply(tuple, 1))
out = df[df.loc[:, ['X', 'Y']].apply(lambda x: tuple(x) in t, axis=1)]

print(out)

图纸:

X  Y Name  Age
0  1  3    J   33
1  1  3    A   47
4  2  3    J   33
5  2  3    P   80

相关问题