如果A列中的值符合要求,如何将B列中的值附加到列表中?

时间:2019-11-08 21:24:45

标签: python pandas dataframe

下面是我的代码。本质上,我试图基于数据框中的值构建几个列表,但是列表索引必须彼此对应。我想将满足条件的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

1 个答案:

答案 0 :(得分:0)

(Pandas具有许多使您想做的事情变得容易的功能。在这个答案中,我只看了发布的python代码。)

主要问题是您首先将row解释为x值,然后尝试使用该x值作为索引。

要获取索引和值,请使用enumerate()

另一个问题是if row >= interval检查x值是否大于间隔的开始,但是您没有检查x值是否小于间隔的结束。因此,您的第一个x_values将获得所有值,而不只是所有属于第一个时间间隔的值。

您可以使用zip单独组合intervals列表。

另一个问题是,您继续使用相同的x_valuesy_values继续为每个间隔追加内容。这样x_valuesy_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