选择“在中使用子查询”

2024-09-29 17:14:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我对熊猫还不熟悉,创建了以下示例来说明我喜欢解决的问题

数据

考虑以下数据文件:

df = pd.DataFrame({ 'Person': ['Adam', 'Adam', 'Cesar', 'Diana', 'Diana', 'Diana', 'Erika', 'Erika'],
                    'Belonging': ['House', 'Car', 'Car', 'House', 'Car', 'Bike', 'House', 'Car'],
                    'Value': [300, 10, 12, 450, 15, 2, 600, 11],
                    })

看起来是这样的:

  Person Belonging  Value
0   Adam     House    300
1   Adam       Car     10
2  Cesar       Car     12
3  Diana     House    450
4  Diana       Car     15
5  Diana      Bike      2
6  Erika     House    600
7  Erika       Car     11

问题

如果人们拥有价值超过400英镑的房子,如何计算他们汽车的价值

我想要的结果是:

  Person Belonging  Value
4  Diana       Car     15
7  Erika       Car     11

我如何在Pandas中实现这一点,是否有类似于子查询的内容

子查询

在SQL中有一种叫做子查询的东西。也许熊猫身上也有类似的东西

SELECT * 
FROM df 
WHERE person IN 
    (SELECT person 
        FROM df 
        WHERE belonging='House' AND value>400)
AND belonging='Car';

person      belonging   value     
----------  ----------  ----------
Diana       Car         15        
Erika       Car         11           

Tags: dfvaluecarselecthouseperson价值cesar
3条回答
print(df[df.Person.isin(df.loc[df.Value > 400, 'Person']) & (df.Belonging == 'Car')])

印刷品:

  Person Belonging  Value
4  Diana       Car     15
7  Erika       Car     11

考虑基于集合的(类似SQL)方法,使用{{CD1>}和^ {< CD2>}保留您的^ {CD3>}子句:

final_df = (
            df.query("Belonging == 'Car'")
              .merge(df.query("Belonging == 'House' & Value > 400"), 
                     on="Person", suffixes=["_Car","_House"])
           )

#   Person Belonging_Car  Value_Car Belonging_House  Value_House
# 0  Diana           Car         15           House          450
# 1  Erika           Car         11           House          600

或者没有房子的柱子:

final_df = (
            df.query("Belonging == 'Car'")
              .merge((df.query("Belonging == 'House' & Value > 400")
                        .reindex(["Person"], axis="columns")), 
                     on="Person")
           )

#   Person Belonging  Value
# 0  Diana       Car     15
# 1  Erika       Car     11

您可以使用的一种方法非常类似于SQL语句

首先找到房屋价值超过400美元的人:

persons = df.loc[(df['Belonging'] == 'House') & (df['Value'] > 400), 'Person']

这将返回一个系列与“戴安娜”和“埃里卡”

然后为这些人找到汽车:

df[df['Person'].isin(persons) & (df['Belonging'] == 'Car')]

这将返回您预期的结果


^{}也可以使用联接,这可能比对大型数据集使用isin()更有效:

df_join = df.merge(persons, on='Person')

然后你可以通过过滤找到汽车:

df_join[df['Belonging'] == 'Car']

这也将返回您预期的结果


解决此问题的一种不同方法是通过将个人物品转换为列来透视数据,这样每个人就可以有一行列出他们的所有物品

您可以使用^{}将此数据放入一个相对平坦的数据框:

df_pivot = df.pivot_table(values='Value', index='Person', columns='Belonging', fill_value=-1)

在这一点上,您可以通过以下方式找到房屋价值超过400美元的人的汽车价值:

df_pivot.loc[df_pivot['House'] > 400, 'Car']

请注意,最后一个将返回一个序列,而不是一个数据帧,因为Person现在被转换为索引。如果您想收集关于某人的更多信息,pivot dataframe方法非常有用,因此将某人放在一行中可以非常轻松地访问与此人相关的所有数据

相关问题 更多 >

    热门问题