这是我的代码:
a = pd.DataFrame([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]], columns=['A', 'B']) print(a) a['C'] = 1 # or np.nan or is there a way to avoid this? b = lambda i : i['A'] + i['B'] + i['C'] # actually what is needed if to access a previous element, like i['C'].shift() a['C'] = a.apply(b, axis=1) print(a)
它可以正常工作,但是在 lambda 中,我想要访问i['C'].shift(1),但如果以这种方式使用它,我会得到以下异常;
i['C'].shift(1)
Traceback (most recent call last): File "C:\Users\Development\workspace\TestPython\TestPython.py", line 31, in <module> a['C'] = a.apply(b, axis=1) File "C:\Program Files\Python36\lib\site-packages\pandas\core\frame.py", line 4262, in apply ignore_failures=ignore_failures) File "C:\Program Files\Python36\lib\site-packages\pandas\core\frame.py", line 4358, in _apply_standard results[i] = func(v) File "C:\Users\Development\workspace\TestPython\TestPython.py", line 29, in <lambda> b = lambda i : i['A'] + i['B'] + i['C'].shift() # actually what is needed if to access a previous element, like i['C'].shift() AttributeError: ("'numpy.int64' object has no attribute 'shift'", 'occurred at index 0')
而且a['C'] = 1如果可能的话,我想避免初始化,这意味着 a[‘C’] 是在此操作中添加的新列。
a['C'] = 1
有什么建议或其他方法可以实现这一目标吗?
你的问题是尝试在 apply 中访问 shift() 方法,但你遇到了 AttributeError,因为在 apply 中,i 是每一行的 Series 对象,而不是整个 DataFrame。因此,i['C'] 变成了一个单个值而不是 Series,所以你不能直接对它使用 shift()。
apply
shift()
AttributeError
i
i['C']
使用 shift() 访问前一个元素: 你可以避免使用 apply() 来访问前一个元素。shift() 方法是 DataFrame 和 Series 的内置方法,应该直接在列上操作,而不是在 apply() 中。
apply()
如何避免初始化列: 你可以先不给 C 列赋值,而是直接通过 shift() 计算前一个元素的值。这里是如何做到这一点:
C
import pandas as pd # 创建 DataFrame a = pd.DataFrame([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]], columns=['A', 'B']) print(a) # 使用 shift() 来计算列 C 的值 a['C'] = a['A'] + a['B'] + a['C'].shift(1) print(a)
a['C']
shift(1)
NaN
fillna
a['C'] = a['A'] + a['B'] + a['C'].shift(1).fillna(0)
这样,NaN 将被 0 替代。
0