熊猫LOC选择值背后的逻辑

时间:2018-12-23 13:11:32

标签: python pandas

我正在尝试学习和理解熊猫LOC背后的逻辑,因此无法对以下问题进行解释。 如果要使用LOC对数据帧进行切片,可以按以下方式进行

dates=pd.date_range('20130101',periods=6)
df=pd.DataFrame(np.random.rand(6,4),index=dates,columns=list('ABCD'))

print(df.loc['20130102':'20130104',['A','B']])  (*)

很好。 我不明白的是,如果在LOC的第二部分中可以输入列标题['A','B']的列表,为什么我不能对行做同样的事情? 即以下内容不起作用

print(df.loc[['20130102','20130104'],['A','B']])

背后的逻辑是什么?我给LOC两个行索引和两个列标题,但是它不起作用。对于列部分,列表是好的,而对于行部分,列表不是。 此外, 在LOC的第一部分(请参阅*),可以使用“:”来访问行的索引,即从index1到index2 ='index1':'index2',但是在LOC函数的第二部分中我不能这样做: 这是行不通的:

print(df.loc['20130102':'20130104',['A':'C']])

我很高兴理解为什么这两行显示的代码行不通。

谢谢。

2 个答案:

答案 0 :(得分:4)

您需要将list的值转换为&:hover:before,因为func MyFunk(itf interface{}) { t := reflect.TypeOf(itf) if t.Kind() == reflect.Struct { // itf is a struct } else if t.Kind() == reflect.Ptr { pt := t.Elem() if pt.Kind() == reflect.Struct { // itf is a pointer to a struct } else { // itf is a pointer to something else } } else { // itf is something else entirely } } ,这意味着必须具有相同类型的list值和DataFrame的索引/列值,否则datetime:< / p>

DatetimeIndex

按索引/列的第一个和最后一个值进行选择

因为partial string indexing,所以不必转换为KeyError

对于按范围选择,仅删除用于选择列的列表print(df.loc[pd.to_datetime(['20130102','20130104']),['A','B']]) A B 2013-01-02 0.719469 0.423106 2013-01-04 0.438572 0.059678

datetimes

用于选择日期时间的类似解决方案:

[]

组合:

print(df.loc['20130102':'20130104','A':'C'])
                   A         B         C
2013-01-02  0.719469  0.423106  0.980764
2013-01-03  0.480932  0.392118  0.343178
2013-01-04  0.438572  0.059678  0.398044

答案 1 :(得分:1)

此代码说明了使用LOC在熊猫中访问数据(切片)的不同方法:

df=pd.DataFrame(np.random.rand(6,4),index=['row1','row2','row3','row4','row5','row6'],columns=list('ABCD'))
         A         B         C         D
row1  0.972614  0.193116  0.448413  0.731300
row2  0.135391  0.783295  0.959058  0.107872
row3  0.966703  0.742793  0.852716  0.710681
row4  0.976819  0.920898  0.665329  0.078999
row5  0.418717  0.122677  0.716004  0.977522
row6  0.101422  0.641862  0.157751  0.888720

行范围列范围:

df.loc['row1':'row3', 'A':'C']

            A         B         C
row1  0.972614  0.193116  0.448413
row2  0.135391  0.783295  0.959058
row3  0.966703  0.742793  0.852716

values_rows column_range:

df.loc[['row1','row3'], 'A':'C']
             A         B         C
row1  0.972614  0.193116  0.448413
row3  0.966703  0.742793  0.852716

行范围列值:

df.loc['row1':'row3', ['A','C']]
            A         C
row1  0.972614  0.448413
row2  0.135391  0.959058
row3  0.966703  0.852716

单个值:

df.loc['row1','A'])

0.972614309371533

结论:使用范围时,请勿将其置于[]之间 但是请使用[]包含值列表。