如何访问 Pandas 中数据框的特定元素。报错

How to access particular elements of a dataframe in Pandas. Gives error

我有一个数据框 df_params。它包含存储过程的参数。

   PurchaseOrderID   OrderDate SupplierReference     DF_Name
0                1  2013-01-01          B2084020  dataframe1
1                2  2013-01-01            293092  dataframe2
2                3  2013-01-01          08803922  dataframe3
3                4  2013-01-01         BC0280982  dataframe4
4                5  2013-01-01         ML0300202  dataframe5

我只想循环访问数据框的元素:

for i in range(len(df_params)):
    print(df_params[i][0])

但它给了我一个没有真正解释的错误:

Traceback (most recent call last):
  File "C:my\path\site-packages\pandas\core\indexes\base.py", line 2897, in get_loc
    return self._engine.get_loc(key)
  File "pandas/_libs/index.pyx", line 107, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/index.pyx", line 131, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 1607, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 1614, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 0

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "Test3.py", line 35, in <module>
    print(df_params[i][0])
  File "C:\Users\my\path\Python37\lib\site-packages\pandas\core\frame.py", line 2995, in __getitem__
    indexer = self.columns.get_loc(key)
  File "C:\Users\my\path\Python37\lib\site-packages\pandas\core\indexes\base.py", line 2899, in get_loc
    return self._engine.get_loc(self._maybe_cast_indexer(key))
  File "pandas/_libs/index.pyx", line 107, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/index.pyx", line 131, in pandas._libs.index.IndexEngine.get_loc
  File "pandas/_libs/hashtable_class_helper.pxi", line 1607, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas/_libs/hashtable_class_helper.pxi", line 1614, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 0
PS Microsoft.PowerShell.Core\FileSystem::\my\path>

目标是为存储过程提供价值:

for i in range(len(df_params)):
    query = "EXEC Purchasing.GetPurchaseOrder " + df_params[i][0] + "," + str(df_params[i][1]) + "," + df_params[i][2])
    df = pd.read_sql(query, conn)

打印(查询)的期望结果:

EXEC Purchasing.GetPurchaseOrder 1, '2013-01-01', 'B2084020'
EXEC Purchasing.GetPurchaseOrder 2, '2013-01-01', '293092'
EXEC Purchasing.GetPurchaseOrder 3, '2013-01-01', '08803922'
EXEC Purchasing.GetPurchaseOrder 4, '2013-01-01', 'BC0280982'
EXEC Purchasing.GetPurchaseOrder 5, '2013-01-01', 'ML0300202'

在数据框架上有更好的方法来访问值,您可以使用 lambda。 使用 lambda 将可以访问任何行。

df.apply(lambda row : print(row['DF_Name']))

现在变量 'row' 是数据框上的每一行,您可以访问该行的每个属性。

pandas.DataFrames 的行为并不完全像 numpy.ndarrays。基本上有三种选择:

选项 1:iterrows-method: 您可以通过

遍历 pandas.dataframe 的行
for idx, row in df_params.iterrows():
    print(row['PurchaseOrderID'])

这是一种特别可读的方式,所以我个人更喜欢这种方式

选项 2:索引: 如果你想索引 pandas.dataframe 就像 numpy.ndarray 对象一样,请使用方法 .iat[]

for i in range(len(df_params)):
    print(df_params.iat[i, 0])

这实际上索引了所有元素并且忽略了数据帧的索引!所以假设你有一个不同的索引(在极端情况下一些字符串或table a pandas.DataTimeIndex) 这仍然有效......就像你会做一个 df_params.to_numpy()[i, 0] 一样。 注意:存在一个使用列名的类似函数:.at[]

还有第二种方法来索引一个 pandas.DataFrame 对象,它只是对列更安全一点:.loc[] 它需要一个 index和列名

for idx in df_params.index:
    print(df_params.iloc[idx, 'PurchaseOrderID'])

选项 3:切片 pandas.Series 对象: pandas.DataFrame 中的每一列都是一个 pandas.Series 对象,您可以将其索引为类似于 索引 上述系列)到 numpy.ndarray :

col = df_params['PurchaseOrderID']
for idx in col.index:
    print(col[idx])

那么你的情况出了什么问题? 双索引几乎与最后一个示例相同 但是 它在幕后调用调用 .loc[] 因此需要一个 列名 和不是数字(这本来是方法 .iloc[]And 它希望先看到列,然后再看到行。 所以如果你真的想要,你可以这样做:

for i in range(len(df_params)):
    print(df_params.iloc[0][i])

但是这只有效,因为你的pandas.DataFrame有从0开始的连续数字索引!所以请不要这样做这个并使用你的 table 的实际索引(实际上使用上面的选项之一而不是最后一个;))