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