python - Pandas 群体内的变量转移

标签 python pandas dataframe lambda pandas-groupby

我有一个数据框:

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 中按滞后行数移动的值​​。这里棘手的部分是移位应该发生在字段 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))

无济于事,并得到“系列的真实值(value)不明确”。错误。感谢任何帮助。谢谢!

最佳答案

您可以通过 self 合并和对索引的一些操作来完成此操作:

# 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

关于python - Pandas 群体内的变量转移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52940317/

相关文章:

Pandas:插入缺失的行数据并在组内使用条件进行迭代

python - "If"嵌套在 "for"中只进入一次

python - 使用字典的嵌套列表理解

python - 根据 NetworkX 中出现的次数计算边的权重

python - 为什么我的 Python 函数不将列转换为日期时间格式

python - 如何用最后一个非空白单元格填充数据框中的空白单元格?

python - 为什么我无法加载使用 pip 安装的 mkl 模块?

python-2.7 - 使用 Python Pandas 进行 CSV 列比较

python - Pandas read_html 生成带有元组列名称的空 df

python - 我想知道当我们只想打印 pandas 中的特定列时如何实现