【问题标题】:How to get individual cell in table using Pandas?如何使用 Pandas 获取表格中的单个单元格?
【发布时间】:2022-01-26 19:58:17
【问题描述】:

我有一张桌子:

      -60   -40   -20     0    20    40    60
100   520   440   380   320   280   240   210
110   600   500   430   370   320   280   250
120   670   570   490   420   370   330   290
130   740   630   550   480   420   370   330
140   810   690   600   530   470   410   370

顶部的标题是风向量,左侧的第一个列是距离。表格“正文”中的实际数据只是一种燃料添加剂。

我对 Pandas 和 Numpy 很陌生,所以请原谅这个问题的简单性。我想知道的是,如何使用标题输入表格以检索一个数字?我已经看到它可以使用索引,但如果我不需要,我不想使用该方法。

例如: 我有一个-60 的风单元和120 的距离,所以我需要检索号码670。我如何使用 Numpy 或 Pandas 来做到这一点?

另外,如果我有一个 -50 的风单元和 125 的距离,那么是否可以以简单的方式插入这些?

编辑:

这是我迄今为止尝试过的:

import pandas as pd

df = pd.read_table('fuel_adjustment.txt', delim_whitespace=True, header=0,index_col=0)

print(df.loc[120, -60])

但得到错误:

line 3083, in get_loc raise KeyError(key) from err
KeyError: -60

【问题讨论】:

  • 假设索引是整数:df.loc[120,-60] 将产生 670

标签: python pandas dataframe numpy


【解决方案1】:

您可以使用以下方法从现有索引中选择任何单元格:

df.loc[120,-60]

然而,索引的类型必须是整数。如果没有,您可以使用以下方法修复它:

df.index = df.index.map(int)
df.columns = df.columns.map(int)

对于插值,您需要使用reindex 添加空的新行/列,然后在每个维度上应用interpolate

(df.reindex(index=sorted(df.index.to_list()+[125]),
           columns=sorted(df. columns.to_list()+[-50]))
   .interpolate(axis=1, method='index')
   .interpolate(method='index')
)

输出:

       -60    -50    -40    -20     0      20     40     60
100  520.0  480.0  440.0  380.0  320.0  280.0  240.0  210.0
110  600.0  550.0  500.0  430.0  370.0  320.0  280.0  250.0
120  670.0  620.0  570.0  490.0  420.0  370.0  330.0  290.0
125  705.0  652.5  600.0  520.0  450.0  395.0  350.0  310.0
130  740.0  685.0  630.0  550.0  480.0  420.0  370.0  330.0
140  810.0  750.0  690.0  600.0  530.0  470.0  410.0  370.0

【讨论】:

  • 这非常有帮助,非常感谢!!
【解决方案2】:

你可以简单地使用 df.loc 来达到这个目的

df.loc[120,-60]

【讨论】:

  • 感谢您的帮助。我现在已经尝试过了,但有一个错误,请查看我编辑的问题。
  • @PW1990 你的索引是什么类型的?检查 my answer 是否转换为 int。
【解决方案3】:

您需要检查索引和列的数据类型。这应该是你失败的原因df.loc[120,-60]

试试:

df.loc[120, "-60"]

要验证数据类型,您可以调用:

>>> df.index
Int64Index([100, 110, 120, 130, 140], dtype='int64')
>>> df.columns
Index(['-60', '-40', '-20', '0', '20', '40', '60'], dtype='object')

如果你想把列的标题变成int64,你可能需要把它变成数字:

df.columns = pd.to_numeric(df.columns)

对于插值,我认为唯一的方法是首先创建不存在的索引和列,然后您可以获得该值。但是,如果频繁查询,它会迅速增加您的 df。

  1. 首先,您需要添加不存在的索引和列。
  2. 按行和按列进行插值。
  3. 获得您的价值。
new_index = df.index.to_list()
new_index.append(125)
new_index.sort()

new_col = df.columns.to_list()
new_col.append(-50)
new_col.sort()

df = df.reindex(index=new_index, columns=new_col)
df = df.interpolate(axis=1).interpolate()
print(df[125, -50])

另一种方法是编写一个函数来获取相对数字并返回插值结果。

  1. 查找目标的上下索引和列。
  2. 获取四个数字。
  3. 按顺序插入索引和列。

【讨论】:

  • 谢谢 Max,这太棒了。我在想,因为会有很多插值组合,最好的办法是按照您的建议进行操作并手动执行,而不是每次都添加行。
  • 确保选择插值方法,否则你只会得到值的平均值;)
猜你喜欢
  • 2022-06-12
  • 1970-01-01
  • 2010-09-27
  • 2011-08-02
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
相关资源
最近更新 更多