下面是我的代码。本质上,我试图基于数据框中的值构建几个列表,但是列表索引必须彼此对应。我想将满足条件的x值添加到一个列表中,并将它们相应的y值添加到另一列表中。
通过错误消息,似乎我无法访问y_column行值,但是我不确定为什么。任何帮助表示赞赏!
df = customer_codes
x_column = 'X'
y_column = 'Y'
num_intervals = 10
maximum = df[x_column].max()
interval = maximum/num_intervals
intervals = []
i = 0
while i <= num_intervals:
value = int(i * interval)
intervals.append(value)
i = i+1
for interval in intervals:
for row in df[x_column]:
if row >= interval:
x_values.append(row)
y_values.append(df[y_column][row])
这是我遇到的错误:
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-61-9e06679fdb72> in <module>()
21 if row >= interval:
22 x_values.append(row)
---> 23 y_values.append(df[y_column][row])
1 frames
/usr/local/lib/python3.6/dist-packages/pandas/core/indexes/base.py in get_value(self, series, key)
4728 k = self._convert_scalar_indexer(k, kind="getitem")
4729 try:
-> 4730 return self._engine.get_value(s, k, tz=getattr(series.dtype, "tz", None))
4731 except KeyError as e1:
4732 if len(self) > 0 and (self.holds_integer() or self.is_boolean()):
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value()
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value()
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()
KeyError: 291061
答案 0 :(得分:0)
(Pandas具有许多使您想做的事情变得容易的功能。在这个答案中,我只看了发布的python代码。)
主要问题是您首先将row
解释为x值,然后尝试使用该x值作为索引。
要获取索引和值,请使用enumerate()
。
另一个问题是if row >= interval
检查x值是否大于间隔的开始,但是您没有检查x值是否小于间隔的结束。因此,您的第一个x_values
将获得所有值,而不只是所有属于第一个时间间隔的值。
您可以使用zip
单独组合intervals
列表。
另一个问题是,您继续使用相同的x_values
和y_values
继续为每个间隔追加内容。这样x_values
和y_values
不断增长。
以下是一些整合了上述内容的示例代码:
import pandas as pd
x_column = 'X'
y_column = 'Y'
data = [[i*i, i] for i in range(100)]
df = pd.DataFrame(data, columns=[x_column, y_column])
num_intervals = 10
maximum = df[x_column].max()
interval_width = maximum/num_intervals
intervals = []
for i in range(num_intervals+1):
value = int(i * interval_width)
intervals.append(value)
for interval_start, interval_end in zip(intervals[:-1], intervals[1:]):
x_values = []
y_values = []
for row, x_val in enumerate(df[x_column]):
if interval_start < x_val <= interval_end:
x_values.append(x_val)
y_values.append(df[y_column][row])
print("interval from", interval_start, "to", interval_end, ":")
print(" x:", x_values)
print(" y:", y_values)
# you probably want to store x_values and y_values belonging to the current interval