#python #python-3.x #pandas
Вопрос:
Почему это приводит к NaN вместо строки?
df['rnd'] = df.apply(lambda x: str(random.randint(0,9999)).zfill(4))
rnd
---
NaN
NaN
NaN
NaN
NaN
df.dtypes
Rnd object
Комментарии:
1. Почему вы вообще используете
apply
here? Просто создайте серию и назначьте ее. Вы ничего не делаете в своемdf
2. @user3483203 Похоже, что это не
Rnd
единственное, что есть в наборе данных; это просто так выглядит в моем вопросе.3. Но вы не получаете доступа к каким-либо данным в вашем фрейме данных, поэтому использование apply не имеет смысла.
x
В вашей лямбда-функции игнорируется, это просто запах кода.4. @user3483203 Я просто пытаюсь добавить новый столбец со случайным значением; Я знаю, что x — это строка, и ее там не должно быть; но я не знаю, что использовать вместо этого.
Ответ №1:
Если вам просто нужен новый случайный столбец (в виде строк с добавлением нуля), вы можете векторизовать его с помощью numpy randint
(который принимает a size
) и str.zfill
, например:
df = pd.DataFrame(np.random.random((4, 3)))
df['rnd'] = np.random.randint(0, 999, size=len(df))
df['rnd'] = df['rnd'].astype(str).str.zfill(4)
Вывод:
0 1 2 rnd
0 0.696305 0.624101 0.235630 0056
1 0.437783 0.558600 0.451735 0913
2 0.061021 0.633813 0.008970 0509
3 0.944699 0.713951 0.478524 0088
Ответ №2:
вам нужно, чтобы applymap не применялся
df['rnd'] = df.applymap(lambda x: str(random.randint(0,9999)).zfill(4))
и это результат
0 0179
1 4545
2 8510
3 3316
Name: rnd, dtype: object
если вы хотите использовать метод apply, тогда вам нужно указать столбец для действия :
df["rnd"] = df.rnd.apply(lambda x: str(random.randint(0,9999)).zfill(4))
Ответ №3:
Для этого нужен an axis
.
df['rnd'] = df.apply(lambda x: str(random.randint(0,9999)).zfill(4), axis=1)