У меня есть фрейм данных со столбцом целых чисел, которые символизируют годы рождения. В каждой строке есть 20xx или 19xx, но в некоторых строках есть только часть xx.
Что я хочу сделать, так это добавить 19 перед этими числами только с двумя «элементами», если целое число больше 22 (начиная с 0), или/и добавить 20 перед теми, которые меньше или равны 22.
Это то, что я написал;
for x in DF.loc[DF["Year"] >= 2022]:
x + 1900
if:
x >= 22
else:
x + 2000
Вы также можете полностью изменить код, я просто хотел бы, чтобы вы объяснили, что именно делает ваш код.
Спасибо всем, кто найдет время, чтобы ответить на этот вопрос.
Это в основном то, что вы сделали, if
внутри for
:
new_list_of_years = []
for year in DF.loc[DF["Year"]:
full_year = year+1900 if year >22 else year+2000
new_list_of_years.append(full_year)
DF['Year'] = pd.DataFrame(new_list_of_years)
Редактировать: Вы также можете сделать это с пониманием списка for-if
:
DF['Year'] = [year+1900 if year > 22 else year+2000 for year in DF.loc[DF["Year"]]]
Вы можете сделать это в одну строку с помощью метода apply
.
Пример:
df = pd.DataFrame({'date': [2002, 95, 1998, 3, 56, 1947]})
print(df)
date
0 2002
1 95
2 1998
3 3
4 56
5 1947
Затем:
df = df.date.apply(lambda x: x+1900 if (x<100) & (x>22) else (x+2000 if (x<100)&(x<22) else x) )
print(df)
date
0 2002
1 1995
2 1998
3 2003
4 1956
5 1947
Вместо перебора строк используйте where
для изменения всего столбца:
y = df["Year"] # just to save typing
df["Year"] = y.where(y > 99, (y + 1900).where(y > 22, y + 2000))
или индексация:
df["Year"][df["Year"].between(0, 21)] += 2000
df["Year"][df["Year"].between(22, 99)] += 1900
df.loc[df["Year"].between(0, 21), "Year"] += 2000
df.loc[df["Year"].between(22, 99), "Year"] += 1900
это запутанный синтаксис, но a.where(cond, b)
сохраняет значения в a
, если cond
истинно, но изменяет значения в b
, если cond
ложно. Таким образом, код говорит: «Если y> 99, оставьте y как есть; иначе, если y> 22, измените его на y + 1900; иначе измените его на y + 2000».
как именно работает первая версия с «.where»? разве это не суммирует значения так, что 99% значений, кроме того, где есть только 2 элемента/буквы/цифры, не имеют смысла?