python - 在 Pandas 中用 Groupby 减去两列

标签 python python-2.7 pandas

我有一个 dataframe 并且想减去前一行的两列,前提是前一行具有相同的 Name 值。如果没有,那么我希望它产生 NAN 并填充 -。我的 groupby 表达式产生错误,TypeError: 'Series' objects are mutable, thus they cannot be hashed,这是非常模糊的。我错过了什么?

import pandas as pd
df = pd.DataFrame(data=[['Person A', 5, 8], ['Person A', 13, 11], ['Person B', 11, 32], ['Person B', 15, 20]], columns=['Names', 'Value', 'Value1'])
df['diff'] = df.groupby('Names').apply(df['Value'].shift(1) - df['Value1'].shift(1)).fillna('-')
print df

期望的输出:

      Names  Value  Value1  diff
0  Person A      5       8     -
1  Person A     13      11    -3
2  Person B     11      32     -
3  Person B     15      20   -21

最佳答案

你可以添加lambda x并将df['Value']更改为x['Value'],类似于值 1 和最后一个 reset_index :

df['diff'] = df.groupby('Names')
               .apply(lambda x: x['Value'].shift(1) - x['Value1'].shift(1))
               .fillna('-')
               .reset_index(drop=True)
print (df)
      Names  Value  Value1 diff
0  Person A      5       8    -
1  Person A     13      11   -3
2  Person B     11      32    -
3  Person B     15      20  -21

另一种解决方案 DataFrameGroupBy.shift :

df1 = df.groupby('Names')['Value','Value1'].shift()
print (df1)
   Value  Value1
0    NaN     NaN
1    5.0     8.0
2    NaN     NaN
3   11.0    32.0
df['diff'] = (df1.Value - df1.Value1).fillna('-')

print (df)
      Names  Value  Value1 diff
0  Person A      5       8    -
1  Person A     13      11   -3
2  Person B     11      32    -
3  Person B     15      20  -21

关于python - 在 Pandas 中用 Groupby 减去两列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37552727/

相关文章:

python - Swifter:向量化函数和非向量化函数有什么区别?

python - 从 Numpy 数组 : How do I specify the index column and column headers? 创建 Pandas DataFrame

python - 生成并要求输入随机生成的密码

python - PyDub:结合音频大小错误?

python - 有没有更快的(numpy?)方法将 pandas df int 列组合成点分隔的 str col 而不出现 TypeError

python 多索引赋值

python - pandas.read_fwf 忽略提供的数据类型

python - 在 Python 脚本中激活 virtualenv

十六进制到十六进制的 Python 字符串(带前导零)

Python 保存一个 eval 函数