使用pandas.DataFrame设置值

Peq*_*que 8 python pandas

拥有此DataFrame:

import pandas

dates = pandas.date_range('2016-01-01', periods=5, freq='H')
s = pandas.Series([0, 1, 2, 3, 4], index=dates)
df = pandas.DataFrame([(1, 2, s, 8)], columns=['a', 'b', 'foo', 'bar'])
df.set_index(['a', 'b'], inplace=True)

df
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我想用一个新的系列取代系列,这个系列只是旧系列,但重新采样到一天(即x.resample('D').sum().dropna()).

当我尝试:

df['foo'][0] = df['foo'][0].resample('D').sum().dropna()
Run Code Online (Sandbox Code Playgroud)

这看起来效果很好:

在此输入图像描述

但是,我收到警告:

SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
Run Code Online (Sandbox Code Playgroud)

问题是,我应该怎么做呢?

笔记

我尝试但不起作用的事情(重新取样或不重新分配引起异常):

df.iloc[0].loc['foo'] = df.iloc[0].loc['foo']
df.loc[(1, 2), 'foo'] = df.loc[(1, 2), 'foo']
df.loc[df.index[0], 'foo'] = df.loc[df.index[0], 'foo']
Run Code Online (Sandbox Code Playgroud)

有关数据的更多信息(如果相关):

  • 真正的DataFrame在多索引中有更多列.并非所有这些都必然是整数,但更通常是数字和分类.索引是唯一的(即:只有一行具有给定的索引值).
  • 当然,真正的DataFrame中还有更多的行(数千个).
  • DataFrame中不一定只有两列,并且可能有多于一列包含Series类型.列通常还包含序列,分类数据和数值数据.任何单个列始终是单一类型(数字,分类或系列).
  • 每个单元格中包含的系列通常具有可变长度(即:DataFrame中的两个系列/单元格除非纯粹重合,否则具有相同的长度,并且可能永远不会具有相同的索引,因为系列之间的日期也不同).

使用Python 3.5.1和Pandas 0.18.1.

ayh*_*han 3

这应该有效:

df.iat[0, df.columns.get_loc('foo')] = df['foo'][0].resample('D').sum().dropna()
Run Code Online (Sandbox Code Playgroud)

Pandas 抱怨链式索引,但是当你不这样做时,它会面临将整个系列分配给单元格的问题。有了iat你就可以强迫这样的事情。我认为这不是一个更好的事情,但似乎是一个可行的解决方案。