将Series对象分配给DataFrame

时间:2017-06-03 02:29:33

标签: python pandas

我正在尝试:

def processor(self, col):
    # Some work here
    col.fillna(0, inplace=True)
    return col

def main(df):
    pool = Pool(self.cpu_size)
    for series_obj, data in pool.imap(
            processor, [df[i] for i in df[col_list]]):
        print(bool(series_obj.is_copy))
        print(bool(df.is_copy))
        df[series_obj.name] = series_obj

但我收到警告:

  

正在尝试在DataFrame的切片副本上设置值。

如何在没有此警告的情况下对DataFrame和Series对象执行相同的操作?

p.s。:可能是处理series_obj是初始df中的一列的提示,但print(bool(series_obj.is_copy))返回False,print(bool(df.is_copy))返回True。

问题出在使用链式索引创建的df参数中。

2 个答案:

答案 0 :(得分:1)

只要series_obj具有兼容索引,您尝试执行的操作就没有错。

问题在于你如何构建df。它是以这样的方式创建的,它被标记为另一个数据帧的视图。您可以输入bool(df.is_copy)来验证这一点。它应该回来True

因此,请让df不再是一个视图:

df = df.copy()

这将把它与其形成的其他数据帧区分开来。请注意,如果你想要这种纠缠,它将不再是!

然后你可以

df[series_obj.name] = series_obj

旁注:我实际上无法在0.20

中重新创建
df_source = pd.DataFrame(1, list('abc'), list('xyz'))

df = df_source[['x', 'z']]

series_obj = pd.Series(2, list('abc'))

print(bool(df.is_copy))

df[series_obj.name] = series_obj

print(bool(df.is_copy))

True
False

答案 1 :(得分:0)

问题出在使用链式索引创建的df参数中。但是在执行main函数期间出现错误。