Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在使用.loc筛选的数据帧上使用.str_Python_Python 3.x_Pandas_Dataframe - Fatal编程技术网

Python 在使用.loc筛选的数据帧上使用.str

Python 在使用.loc筛选的数据帧上使用.str,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我试图在名为Druges\u tall的数据框中,在名为date\u of\u birth的列中,用一些零填充float(64)值出生日期包含一些NA 这是我最初的想法: drugs_tall.loc[drugs_tall['date_of_birth'].isnull() == False, ['date_of_birth']] = drugs_tall.loc[drugs_tall['date_of_birth'].isnull() == False, ['date_of_birth']].

我试图在名为
Druges\u tall
的数据框中,在名为
date\u of\u birth
的列中,用一些零填充
float(64)
值<代码>出生日期包含一些
NA

这是我最初的想法:

drugs_tall.loc[drugs_tall['date_of_birth'].isnull() == False, ['date_of_birth']] = drugs_tall.loc[drugs_tall['date_of_birth'].isnull() == False, ['date_of_birth']].astype('int').astype('str').str.zfill(6)
但是,这会产生错误

AttributeError: 'DataFrame' object has no attribute 'str'
我只是通过做(这很有效)来解决这个问题:

请注意,无法直接转到:

drugs_tall['date_of_birth'] = drugs_tall['date_of_birth'].str.zfill(6)
因为这将产生错误:

AttributeError: Can only use .str accessor with string values, which use 
np.object_ dtype in pandas
如果不使用.loc选择,也无法更改数据类型:

drugs_tall['date_of_birth'].astype('int').astype('str')
这将使:

ValueError: Cannot convert non-finite values (NA or inf) to integer
我是以一种奇怪的方式来处理这个问题,还是误解了数据帧是如何工作的?我知道我的双线解决方案相当简单,但我不明白是什么使双线解决方案与我最初的想法不同


谢谢

您的列索引器应该是标量的
'dob'
而不是列表
['dob']
。这就是为什么要将数据帧作为索引操作的输出。这有一定道理:列序列被解释为数据帧,标量列给出一个序列

对于您的任务,您可以将
pd.Series.notnull
pd.DataFrame.loc
一起使用。如果Pandas将您的值存储为
float
,建议使用整数转换

df = pd.DataFrame({'dob': [np.nan, None, 11585, 52590]})

mask = df['dob'].notnull()
df.loc[mask, 'dob'] = df.loc[mask, 'dob'].astype(int).astype(str).str.zfill(6)

print(df)

      dob
0     NaN
1     NaN
2  011585
3  052590

哇,太简单了,谢谢!那么什么时候使用列索引器中的列表合适呢?@KelleyBrady,当您希望对数据帧而不是单个序列进行操作时。通常,对于查询和更新单个系列的任务,不要使用列表。
df = pd.DataFrame({'dob': [np.nan, None, 11585, 52590]})

mask = df['dob'].notnull()
df.loc[mask, 'dob'] = df.loc[mask, 'dob'].astype(int).astype(str).str.zfill(6)

print(df)

      dob
0     NaN
1     NaN
2  011585
3  052590