【问题标题】:How to get value from a row in Pandas DataFrame?如何从 Pandas DataFrame 中的一行获取值?
【发布时间】:2021-05-29 20:07:45
【问题描述】:

我有一个包含一行的 pandas 数据框。我知道这一行中的列名是什么。我想从该行的每个单元格中提取值(只是值,而不是类型或其他元数据)。我该怎么做呢?我正在使用 Python 3。

我尝试了以下方法,但总是失败,因为您不能使用列。

print(data_frame.head().values['ColumnName'])

然后我尝试了这个,它给了我 ColumnName 的值,但随后崩溃了。

print(data_frame.iloc[0]['ColumnName'])

文件“/usr/local/lib/python3.8/dist-packages/pandas/core/indexing.py”,第 895 行,在 getitem 中 return self._getitem_axis(maybe_callable, axis=axis) _getitem_axis 中的文件“/usr/local/lib/python3.8/dist-packages/pandas/core/indexing.py”,第 1501 行 self._validate_integer(键,轴) _validate_integer 中的文件“/usr/local/lib/python3.8/dist-packages/pandas/core/indexing.py”,第 1444 行 raise IndexError("单个位置索引器越界") IndexError:单个位置索引器超出范围

如果我循环遍历它,我可以让它工作,但我不需要或不想要这个,因为我只有一行。

for x in data_frame.itertuples(index=False):
     print(x.ColumnName1)
     print(x.ColumnName2)

我还能够获得一些东西来为我提供价值以及一堆其他元数据,但不幸的是我不记得我用什么代码来获得它。

我想做的就是这样并获得 ColumnName 的值。

data_frame[0]['ColumnName']

这可能吗?

编辑这里是代码。它调用 SQL 数据库中的存储过程。

    query = "EXEC p_get_data @id = '{0}'".format(id)
connection_string = get_connection_string()
engine = sqlalchemy.create_engine(connection_string)
data_frame = pd.read_sql_query(query, engine)
data_frame.reset_index(inplace=True)

#print(data_frame.loc[0]['ColumnName1'])
#print(data_frame.loc[0, 'ColumnName1'])
#print(data_frame['ColumnName1'].values[0])
#print(data_frame['ColumnName1'].iloc[0])
#print(data_frame.iat[0, data_frame.columns.get_loc('ColumnName1')])
print(data_frame['ColumnName1'][0] )

存储过程

ALTER PROCEDURE [dbo].[p_get_data]
    @id varchar(200)
AS
    SELECT A.ColumnName1, E.ColumnName2 
    FROM E (NOLOCK)
    INNER JOIN A (NOLOCK) ON E.PrimaryKey = A.PrimaryKey
    WHERE Id = @id
      AND A.Type = 'test' 

数据如下:(ColumnName1 是整数,ColumnName2 是 varchar

ColumnName1     ColumnName2
---------------------------
1               ABCDE1234

【问题讨论】:

  • 试试这个:data_frame['ColumnName'][0]

标签: python python-3.x pandas dataframe


【解决方案1】:

如果是单行, 你应该可以使用这样的东西:

>>> data_frame['colName'].values[0]
Out[8]: 1

或者,

>>> data_frame['colName'].iloc[0]
Out[9]: 1

或者,

>>> data_frame.iloc[0, data_frame.columns.get_loc('colName')]
Out[11]: 1

或者,

>>> data_frame.iat[0, data_frame.columns.get_loc('colName')]
Out[12]: 1

或者,

>>> data_frame.loc[0, 'colName']
Out[13]: 1

【讨论】:

  • 所有这些都失败,并出现'IndexError:单个位置索引器超出范围;输入错误。
  • 我什至已经包含了输出,它们似乎都工作正常...尝试将您的数据添加到问题中
  • 原因也可能是索引,尝试重置索引。 data_frame.reset_index(inplace=True)
  • 刚刚编辑了问题。我在使用 reset_index 时遇到了同样的错误。
  • 我得到的错误是因为我循环了一些值并多次调用存储过程。其中一次是返回一个长度为 0 的数据帧。那是索引超出范围的来源。感谢您的帮助。
【解决方案2】:

玩具示例

假设您有以下 DataFrame:

In [1]: import pandas as pd
In [5]: df = pd.DataFrame({"ColumnName1":[1],"ColumnName2":['text']})

那么你有:

In [6]: df
Out[6]: 
   ColumnName1 ColumnName2
0            1        text

单行值

如果你想从第一行获取值,你只需要使用:

In [9]: df.iloc[0]
Out[9]: 
ColumnName1       1
ColumnName2    text
Name: 0, dtype: object

或者:

In [10]: df.iloc[0,:]
Out[10]: 
ColumnName1       1
ColumnName2    text
Name: 0, dtype: object

如果你想得到一个数组,你可以使用:

In [11]: df.iloc[0].values
Out[11]: array([1, 'text'], dtype=object)

来自单个单元格的值

如果您想要单个单元格中的值,只需使用:

In [14]: df.iloc[0,0]
Out[14]: 1

In [15]: df.iloc[0,1]
Out[15]: 'text'

甚至:

In [22]: df.ColumnName1[0]
Out[22]: 1

In [23]: df.ColumnName2[0]
Out[23]: 'text'

【讨论】:

    猜你喜欢
    • 2019-02-07
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    相关资源
    最近更新 更多