迭代数据框列的多个操作(应用函数?)
Multiple operations iterating over dataframe columns (apply function?)
我有一个包含数千列的 pandas 数据框,我想对数据框的每一列执行以下操作:
- 检查第
i
个值和第 i-1
个值是否在范围内(在 x
和 y
之间);
- 如果满足#1,则找到第
log(i/i-1) ** 2
列;
- 如果#1不满足,假设0;
- 求出每列 #2 的总数。
这是一个只有一列的数据框:
d = {'col1': [10, 15, 23, 16, 5, 14, 11, 4]}
df = pd.DataFrame(data = d)
df
x = 10
和 y = 20
这是我可以为这一列做的事情:
df["IsIn"] = "NA"
for i in range(1, len(df.col1)):
if (x < df.col1[i] < y) & (x < df.col1[i - 1] < y):
df.IsIn[i] = 1
else:
df.IsIn[i] = 0
df["rets"] = np.log(df["col1"] / df["col1"].shift(1))
df["var"] = df["IsIn"] * df["rets"]**2
Total = df["var"].sum()
Total
理想情况下,我将为每列提供一个 Totals
的(1 by n-cols)数据框。我怎样才能最好地实现这一目标?如果您能用详细的解释来补充您的答案,我将不胜感激。
是的,这是 apply
起作用的实例。您只需要将您的逻辑包装在一个函数中。另外,考虑between
和shift
条件消除第一个循环:
def func(s, x=10, y=20):
'''
compute the value given a series
'''
# mask where values are between x and y
valid = s.between(x,y)
# shift `valid` and double check
valid = valid & valid.shift(fill_value=False)
# squared log, mask with `valid`, and sum
return (np.log(s/s.shift())**2 * valid).sum()
# apply `func` on the columns
df.apply(func, x=10, y=20)
输出:
col1 0.222561
dtype: float64
我有一个包含数千列的 pandas 数据框,我想对数据框的每一列执行以下操作:
- 检查第
i
个值和第i-1
个值是否在范围内(在x
和y
之间); - 如果满足#1,则找到第
log(i/i-1) ** 2
列; - 如果#1不满足,假设0;
- 求出每列 #2 的总数。
这是一个只有一列的数据框:
d = {'col1': [10, 15, 23, 16, 5, 14, 11, 4]}
df = pd.DataFrame(data = d)
df
x = 10
和 y = 20
这是我可以为这一列做的事情:
df["IsIn"] = "NA"
for i in range(1, len(df.col1)):
if (x < df.col1[i] < y) & (x < df.col1[i - 1] < y):
df.IsIn[i] = 1
else:
df.IsIn[i] = 0
df["rets"] = np.log(df["col1"] / df["col1"].shift(1))
df["var"] = df["IsIn"] * df["rets"]**2
Total = df["var"].sum()
Total
理想情况下,我将为每列提供一个 Totals
的(1 by n-cols)数据框。我怎样才能最好地实现这一目标?如果您能用详细的解释来补充您的答案,我将不胜感激。
是的,这是 apply
起作用的实例。您只需要将您的逻辑包装在一个函数中。另外,考虑between
和shift
条件消除第一个循环:
def func(s, x=10, y=20):
'''
compute the value given a series
'''
# mask where values are between x and y
valid = s.between(x,y)
# shift `valid` and double check
valid = valid & valid.shift(fill_value=False)
# squared log, mask with `valid`, and sum
return (np.log(s/s.shift())**2 * valid).sum()
# apply `func` on the columns
df.apply(func, x=10, y=20)
输出:
col1 0.222561
dtype: float64