我使用Pandas数据帧来操作数据,我通常将它们可视化为虚拟电子表格,行和列定义单个单元格的位置。我对数据帧切片和切块的方法感到满意,但是当数据帧包含单行时,似乎有一些奇怪的行为。基本上,我想从大型父数据帧中选择满足特定条件的数据行,然后将这些结果作为子数据帧传递给单独的函数以进行进一步处理。有时,父数据帧中只有一条记录符合定义的条件,因此,子数据帧将仅包含一行。尽管如此,我仍然需要能够以与父数据库相同的方式访问子数据库中的数据。为了说明可能的观点,请考虑以下数据帧:
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)
看起来像:
group string
0 1 a
1 1 b
2 1 c
3 1 d
4 2 a
5 2 b
6 2 c
7 2 d
例如,我现在可以选择那些"组"== 2 和"字符串"== "c"的行,这只产生一行。正如预期的那样,数据帧的长度为 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
在我看来,这两种方法实际上都在做同样的事情,即选择一行数据。但是,在第二个示例中,行和列被转置,因此无法以预期的方式提取数据。
为什么这两种行为应该存在?将数据帧的单行转置为默认行为有什么意义?如何确保包含单行的数据帧在传递给另一个函数时不会被转置?
tempDF3 = tempDF.loc[6,['group','string']]
.loc
选择的第一个位置的6
指示返回类型将是系列,因此您的问题。 而是使用 [6]
:
tempDF3 = tempDF.loc[[6],['group','string']]