Pandas 变量在组内移动
Posted
技术标签:
【中文标题】Pandas 变量在组内移动【英文标题】:Pandas variable shifting within groups 【发布时间】:2019-03-27 04:13:45 【问题描述】:我有一个数据框:
c1 Lag Val1
A 3 10
A 1 5
A 2 20
A 2 15
A 1 10
B 1 25
B 2 10
我想创建一个新字段 val2 使得 val2 中的每个值都是 val2 中的值,该值由 Lag 行数移动。这里棘手的部分是转换应该发生在字段 c1 中定义的组内,这样输出看起来像
c1 Lag Val1 Val2
A 3 10 15
A 1 5 20
A 2 20 10
A 2 15 NaN
A 1 10 NaN
B 1 25 10
B 2 10 NaN
我一直在尝试
df['Val2'] = df.groupby(['c1'])['Val1'].apply(lambda x:x.shift(df.Lag))
无济于事并获得“系列的真值是模棱两可的”。错误。感谢任何帮助。谢谢!
【问题讨论】:
【参考方案1】:您可以通过 self-merge
和对索引进行一点操作来完成此操作:
# Copy and keep only the columns that are relevant
df2 = df.rename(columns='Val1': 'Val2').drop(columns='Lag').copy()
# Shift the index
df.index = df.index+df.Lag
# Merge, requiring match on shifted index and within group.
df.reset_index().merge(df2.reset_index(), on=['index', 'c1'], how='left').drop(columns='index')
输出:
c1 Lag Val1 Val2
0 A 3 10 15.0
1 A 1 5 20.0
2 A 2 20 10.0
3 A 2 15 NaN
4 A 1 10 NaN
5 B 1 25 10.0
6 B 2 10 NaN
【讨论】:
【参考方案2】:您很可能必须为应用编写自己的函数。这样的事情会起作用,但可能有比迭代行和重复计算行移位更有效的方法......
def shift_rows(g):
g['Val2'] = np.nan
for i,r in g.iterrows():
g.at[i, 'Val2'] = g['Val1'].shift(-r['Lag'])[i]
return g
output = df.groupby('c1').apply(shift_rows)
print(output)
c1 Lag Val1 Val2
0 A 3 10 15.0
1 A 1 5 20.0
2 A 2 20 10.0
3 A 2 15 NaN
4 A 1 10 NaN
5 B 1 25 10.0
6 B 2 10 NaN
这个想法是遍历 groupby 对象的每一行以使用 Lag
中的值计算行移位,然后拉出你想要的新值。这将存储到该行的 Val2
中,并返回整个组
【讨论】:
以上是关于Pandas 变量在组内移动的主要内容,如果未能解决你的问题,请参考以下文章