Создание новой переменной с использованием информации из нескольких строк в кадре данных

Если вам нужна одна строка, используйте order by и limit:

SELECT F. *
FROM FOLIOS F
ORDER BY F.FOLIO DESC
LIMIT 1;
2
задан TheBob413849 18 January 2019 в 18:40
поделиться

2 ответа

Я бы использовал groupby для чего-то подобного, так как вы можете иметь дело с каждым домохозяйством одновременно

Пример (обратите внимание, что не все случаи обрабатываются)

import pandas as pd

# Create the dataframe
df = pd.DataFrame(data={
    "TypeOfPerson": ["Son", "Parent", "Daughter", "Son", "Parent", "Daughter", "Daughter", "Parent", "Son"],
    "HouseholdNumber": [1, 1, 1, 1, 2, 2, 2, 3, 3],
    "Age": [17,50,20,13,40,19,5, 50, 25]
})

# Add new column
df["Child"] = pd.Series()

# Group by household
households = df.groupby("HouseholdNumber")

# Iterate through groups
for household_number in households.groups:
    household = households.get_group(household_number)

    # Household offspring
    offspring = household.query("TypeOfPerson == 'Son' | TypeOfPerson == 'Daughter'")

    # Sons and daughters that are 18 or younger
    children = offspring.query("Age <= 18")

    # Sons and daughters that young adults (19 >= age <= 25)
    young_adults = household.query("Age >= 19 & Age <= 25")

    # Parents
    parents = household.query("TypeOfPerson == 'Parent'")

    # Change original data frame
    df.loc[offspring.index, "Child"] = "No"
    if children.shape[0]:
        df.loc[parents.index, "Child"] = "a" 
    elif young_adults.shape[0]:
         df.loc[parents.index, "Child"] = "b" 
0
ответ дан Alter 18 January 2019 в 18:40
поделиться

Ошибка здесь в том, что вы обращаетесь к df.loc со списком индексов, например:

 df.loc[df.TypeOfPerson.isin(["Son", "Daughter"]) & (df.Age <= 18)]

вернет фрейм данных с несколькими строками. Поэтому, когда вы помещаете его за if, он спрашивает, как оценить этот фрейм данных как логическое значение, будет ли это any ячеек True или all ячеек True и т. Д.

Один из способов исправить ошибку - указать указанную операцию, или, в вашем случае, вы хотите узнать, есть ли в доме дети, вы можете просто проверить длину отрезанного кадра данных:

for i in df["HouseholdNumber"].unique():
    # you didn't use this i in your code
    ppl_in_house = (df.HouseholdNumber == i)
    is_child = df.TypeOfPerson.isin(["Son", "Daughter"])

    num_children = sum(ppl_in_house & is_child)
[ 1111] Конечно, это только один способ решить вашу проблему, а не лучший.

0
ответ дан Quang Hoang 18 January 2019 в 18:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: