python dataframe index loc_python – pandas:用loc迭代DataFrame索引

博客讨论了在使用Pandas时遇到的一个问题,即`df.loc`在处理包含日期和字符串的系列时,将字符串意外转换为时间戳。问题源于Pandas尝试将数据转换为适当的数据类型,导致'Wed'被错误地转换为Timestamp。提出了几种解决方案,包括在使用.loc之前访问系列,使用DataFrame的索引选择器,以及将工作日存储为整数。这些方法可以避免时间戳和字符串混合的问题,确保数据正确处理。
摘要由CSDN通过智能技术生成

问题不在于df.loc;

df.loc [idx,’Weekday’]刚刚返回一个系列.

令人惊讶的行为是由于pd.Series尝试将类似日期时间的值转换为Timestamps的方式.

df.loc[0,'Weekday']

形成系列

pd.Series(np.array([pd.Timestamp('2014-01-01 00:00:00'),'WED'],dtype=object))

当调用pd.Series(…)时,它将tries to cast the data转换为适当的dtype.

sample = v[:min(3,len(v))]

inferred_type = lib.infer_dtype(sample)

这是检查数据的前几个元素并尝试推断dtype.

当其中一个值是pd.Timestamp时,Pandas会检查是否所有数据都可以转换为时间戳.实际上,’Wed’可以转换为pd.Timestamp:

In [138]: pd.Timestamp('Wed')

Out[138]: Timestamp('2014-12-17 00:00:00')

这是问题的根源,导致pd.Series返回

两个时间戳而不是时间戳和字符串:

In [139]: pd.Series(np.array([pd.Timestamp('2014-01-01 00:00:00'),dtype=object))

Out[139]:

0 2014-01-01

1 2014-12-17

dtype: datetime64[ns]

因此返回

In [140]: df.loc[0,'Weekday']

Out[140]: Timestamp('2014-12-17 00:00:00')

而不是’星期三’.

替代方案:首先选择系列df [‘Weekday’]:

有很多解决方法; EdChum表明,向样本添加非日期(整数)值可以防止pd.Series将所有值强制转换为时间戳.

或者,您可以在使用.loc之前访问df [‘Weekdays’]:

for idx in df.index:

print df['Weekday'].loc[idx]

替代方案:df.loc [[idx],’Weekday’]:

另一种选择是

for idx in df.index:

print df.loc[[idx],'Weekday'].item()

df.loc [[idx],’Weekday’]首先选择DataFrame df.loc [[idx]].例如,当idx等于0时,

In [10]: df.loc[[0]]

Out[10]:

Date Weekday

0 2014-01-01 WED

而df.loc [0]返回系列:

In [11]: df.loc[0]

Out[11]:

Date 2014-01-01

Weekday 2014-12-17

Name: 0,dtype: datetime64[ns]

Series尝试将值转换为单个有用的dtype. DataFrame可以为每列提供不同的dtype.因此,Date列中的Timestamp不会影响Weekday列中值的dtype.

因此,使用返回DataFrame的索引选择器可以避免问题.

替代方案:使用整数作为工作日

另一种方法是在工作日存储isoweekday整数,并在打印时仅在结尾处转换为字符串:

import datetime

import pandas as pd

dict_weekday = {1: 'MON',columns=['Date'])

df['Weekday'] = df['Date'].dt.weekday+1 # add 1 for isoweekday

for idx in df.index:

print dict_weekday[df.loc[idx,'Weekday']]

替代方案:使用df.ix:

df.loc是_LocIndexer,而df.ix是_IXIndexer.他们有

不同的__getitem__方法.如果您单步执行代码(例如,使用pdb),您将找到df.ix calls df.getvalue:

def __getitem__(self,key):

if type(key) is tuple:

try:

values = self.obj.get_value(*key)

并且DataFrame方法df.get_value成功返回’WED’:

In [14]: df.get_value(0,'Weekday')

Out[14]: 'WED'

这就是为什么df.ix是另一种在这里工作的选择.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值