【问题标题】:Accessing data in a Pandas dataframe with one row用一行访问 Pandas 数据框中的数据
【发布时间】:2016-04-22 21:31:32
【问题描述】:

我使用 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

例如,我现在可以选择 'group' == 2 和 'string' == '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

在我看来,这两种方法实际上都在做同样的事情,即选择单行数据。但是,在第二个示例中,行和列被转置,因此无法以预期的方式提取数据。

为什么要存在这两种行为?将数据帧的单行转换为默认行为有什么意义?当我将包含单行的数据框传递给另一个函数时,如何确保它不会被转置?

【问题讨论】:

  • tempDF.loc[6:6] 会解决您的问题吗?
  • 我猜第二个实际上是返回一个 ndarray
  • @MaxU - 是的,这也有效。感谢您的回复。

标签: python python-3.x pandas dataframe


【解决方案1】:
tempDF3 = tempDF.loc[6,['group','string']]

.loc 选择的第一个位置的6 指示返回类型将是一个系列,因此您的问题。而是使用[6]:

tempDF3 = tempDF.loc[[6],['group','string']]

【讨论】:

  • 所以我想将列表传递给 .loc() 是要遵循的规则。非常感谢——我本来可以找几个小时来找到这样一个微妙的解决方案。
  • 我刚刚注意到将列表传递给 loc 非常慢。但是传递 slice 即 .loc[6:6] 速度很快,可以根据需要工作
  • @AnatoliyOrlov 这很有趣。我要搞砸了。谢谢你告诉我。
猜你喜欢
  • 2016-09-28
  • 1970-01-01
  • 2018-02-05
  • 2016-08-16
  • 1970-01-01
  • 2015-01-19
  • 2021-09-14
  • 2020-12-14
  • 2023-02-24
相关资源
最近更新 更多