如何访问 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.DataFrame
s 的行为并不完全像 numpy.ndarray
s。基本上有三种选择:
选项 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 的实际索引(实际上使用上面的选项之一而不是最后一个;))
我有一个数据框 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.DataFrame
s 的行为并不完全像 numpy.ndarray
s。基本上有三种选择:
选项 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 的实际索引(实际上使用上面的选项之一而不是最后一个;))