【问题标题】:Pandas - fill new column with values from following day熊猫 - 用第二天的值填充新列
【发布时间】:2019-01-26 17:27:35
【问题描述】:

在以下数据框中

#Create data
data = {'Day': [1,1,2,2,3,3],
        'Where': ['A','B','A','B','B','B'],
        'What': ['x','y','x','x','x','y'],
        'Dollars': [100,200,100,100,100,200]}

index = range(len(data['Day']))

columns = ['Day','Where','What','Dollars']


df = pd.DataFrame(data,  index=index, columns=columns)
df

我想添加一个包含未来值的列。在这种情况下,第一个值应该是 100,因为在第 2 天 A x 以 100 美元的价格售出。完整的列应包含值100, None, None, 100, None, None

我认为我可以通过以下方式索引单元格

df2 = df
df2['Tomorrow_Dollars'] = df[df.Day == df2.Day+1,'Dollars']

但这会引发以下错误

TypeError: 'Series' 对象是可变的,因此它们不能被散列

是否有解决方案或更智能的方法?

【问题讨论】:

  • 请添加您的预期输出。
  • @coldspeed 请注意我做到了:一列包含 100、无、无、100、无、无。对不起,如果它有点隐藏

标签: python pandas


【解决方案1】:

想法是添加由reindexMultiIndex.from_product 创建缺少的组合,由unstack 重塑为独特的Days,所以可能shift。最后重新整形并join 用于新列:

df1 = df.set_index(['Day','Where','What'])
mux = pd.MultiIndex.from_product(df1.index.levels, names=df1.index.names)

s = df1.reindex(mux)['Dollars'].unstack([1,2]).shift(-1).unstack().rename('Tomorrow_Dollars')

df = df.join(s, on=['Where','What','Day'])
print (df)
   Day Where What  Dollars  Tomorrow_Dollars
0    1     A    x      100             100.0
1    1     B    y      200               NaN
2    2     A    x      100               NaN
3    2     B    x      100             100.0
4    3     B    x      100               NaN
5    3     B    y      200               NaN

【讨论】:

  • :哦,我永远也做不到!谢谢!能否请您简要解释一下我收到错误的原因?
  • @shamalaia - 当然,更正错误很简单 - df.loc[df.Day == df2.Day+1,'Dollars'] - 它与选择列 Dollars 链接在一起 boolean indexing。不幸的是,缺少一些值,所以需要像我的回答一样重新索引。
猜你喜欢
  • 2021-03-18
  • 2022-01-24
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多