我使用Pandas数据帧来操作数据,我通常将它们可视化为虚拟的电子表格,用行和列定义各个单元格的位置。我对数据帧切片和切分的方法很满意,但是当数据帧包含一行时,似乎会有一些奇怪的行为。基本上,我希望从满足特定条件的大型父数据帧中选择数据行,然后将这些结果作为子数据帧传递给一个单独的函数进行进一步处理。有时父数据帧中只有一条满足定义条件的记录,因此,子数据帧只包含一行。尽管如此,我仍然需要能够以与父数据库相同的方式访问子数据库中的数据。为了说明may point,请考虑以下数据帧:
import pandas as pd
tempDF = pd.DataFrame({'group':[1,1,1,1,2,2,2,2],
'string':['a','b','c','d','a','b','c','d']})
print(tempDF)
看起来像:
^{pr2}$作为一个例子,我现在可以选择'group'==2和'string'=='c'的行,这只产生一行。正如预期的那样,dataframe的长度是1,并且可以根据原始数据帧中的索引值使用.ix()只打印一个单元格:
tempDF2 = tempDF.loc[((tempDF['group']==2) & (tempDF['string']=='c')),['group','string']]
print(tempDF2)
print('Length of tempDF2 = ',tempDF2.index.size)
print(tempDF2.loc[6,['string']])
输出:
group string
6 2 c
Length of tempDF2 = 1
string c
但是,如果我使用.loc选择一行,那么数据帧将以转置的形式打印,并且数据帧的长度现在被指定为2(而不是1)。显然,不再可能根据原始父数据帧的索引选择单个单元格值:
tempDF3 = tempDF.loc[6,['group','string']]
print(tempDF3)
print('Length of tempDF3 = ',tempDF3.index.size)
输出:
group 2
string c
Name: 7, dtype: object
Length of tempDF3 = 2
在我看来,这两种方法实际上都在做同样的事情,即选择一行数据。然而,在第二个示例中,行和列被转置,因此无法以预期的方式提取数据。在
为什么要存在这两种行为?将数据帧的一行作为默认行为转置有何意义?如何确保包含单行的数据帧在传递给另一个函数时不会被转置?在
在
^{pr2}$.loc
选择的第一个位置中的6
指示返回类型将是一个序列,因此您的问题。而是使用[6]
:相关问题 更多 >
编程相关推荐