Есть ли какая-либо причина, по которой это приводит к NaN вместо сгенерированного str?

#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)