python – pandas:用loc迭代DataFrame索引

前端之家收集整理的这篇文章主要介绍了python – pandas:用loc迭代DataFrame索引前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我似乎无法找到.loc行为背后的原因.我知道它是基于标签的,所以如果我遍历Index对象,下面的最小例子应该可行.但事实并非如此.我当然用Google搜索,但我需要一些已经掌握索引的人的其他解释.
import datetime
import pandas as pd

dict_weekday = {1: 'MON',2: 'TUE',3: 'WED',4: 'THU',5: 'FRI',6: 'SAT',7: 'SUN'}
df = pd.DataFrame(pd.date_range(datetime.date(2014,1,1),datetime.date(2014,15),freq='D'),columns=['Date'])
df['Weekday'] = df['Date'].apply(lambda x: dict_weekday[x.isoweekday()])

for idx in df.index:
    print df.loc[idx,'Weekday']@H_502_3@

解决方法

问题不在于df.loc;
df.loc [idx,’Weekday’]刚刚返回一个系列.
令人惊讶的行为是由于pd.Series尝试将类似日期时间的值转换为Timestamps的方式.
df.loc[0,'Weekday']@H_502_3@ 
 

形成系列@H_404_13@

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

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

如果您浏览代码,您会发现它最终到达these lines in pandas.core.common._possibly_infer_to_datetimelike:@H_404_13@

sample = v[:min(3,len(v))]
inferred_type = lib.infer_dtype(sample)@H_502_3@ 
 

这是检查数据的前几个元素并尝试推断dtype.
当其中一个值是pd.Timestamp时,Pandas会检查是否所有数据都可以转换为时间戳.实际上,’Wed’可以转换为pd.Timestamp:@H_404_13@

In [138]: pd.Timestamp('Wed')
Out[138]: Timestamp('2014-12-17 00:00:00')@H_502_3@ 
 

这是问题的根源,导致pd.Series返回
两个时间戳而不是时间戳和字符串:@H_404_13@

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]@H_502_3@ 
 

因此返回@H_404_13@

In [140]: df.loc[0,'Weekday']
Out[140]: Timestamp('2014-12-17 00:00:00')@H_502_3@ 
 

而不是’星期三’.@H_404_13@

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

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

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

for idx in df.index:
    print df['Weekday'].loc[idx]@H_502_3@ 
 

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

另一种选择是@H_404_13@

for idx in df.index:
    print df.loc[[idx],'Weekday'].item()@H_502_3@ 
 

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

In [10]: df.loc[[0]]
Out[10]: 
        Date Weekday
0 2014-01-01     WED@H_502_3@ 
 

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

In [11]: df.loc[0]
Out[11]: 
Date      2014-01-01
Weekday   2014-12-17
Name: 0,dtype: datetime64[ns]@H_502_3@ 
 

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

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

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

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

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']]@H_502_3@ 
 

替代方案:使用df.ix:@H_404_13@

df.loc是_LocIndexer,而df.ix是_IXIndexer.他们有
不同的__getitem__方法.如果您单步执行代码(例如,使用pdb),您将找到df.ix calls df.getvalue:@H_404_13@

def __getitem__(self,key):
    if type(key) is tuple:
        try:
            values = self.obj.get_value(*key)@H_502_3@ 
 

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

In [14]: df.get_value(0,'Weekday')
Out[14]: 'WED'@H_502_3@ 
 

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

猜你在找的Python相关文章