Если вам нужна одна строка, используйте order by
и limit
:
SELECT F. *
FROM FOLIOS F
ORDER BY F.FOLIO DESC
LIMIT 1;
Я бы использовал 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"
Ошибка здесь в том, что вы обращаетесь к 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] Конечно, это только один способ решить вашу проблему, а не лучший.