gpt4 book ai didi

python - Pandas 高级索引分配

转载 作者:行者123 更新时间:2023-11-28 21:27:12 25 4
gpt4 key购买 nike

在 Pandas (v0.8.0) DataFrame 中,我想用另一列覆盖一个列。

下面的代码抛出列出的错误。

实现此目标的有效替代方法是什么?

df = DataFrame({'a' : range(0,7),
'b' : np.random.randn(7),
'c' : np.random.randn(7),
'd' : np.random.randn(7),
'e' : np.random.randn(7),
'f' : np.random.randn(7),
'g' : np.random.randn(7)})

# overwrite cols
df.ix[:,'b':'d'] = df.ix[:, 'e':'g']

Traceback (most recent call last):
File "C:\Python27\lib\site-packages\pandas\core\indexing.py", line 68, in __setitem__
self._setitem_with_indexer(indexer, value)
File "C:\Python27\lib\site-packages\pandas\core\indexing.py", line 98, in _setitem_with_indexer
raise ValueError('Setting mixed-type DataFrames with '
ValueError: Setting mixed-type DataFrames with array/DataFrame pieces not yet supported

已编辑

作为排列,我如何指定要设置的行的子集

df.ix[df['a'] < 3, 'b':'d'] = df.ix[df['a'] < 3, 'e':'g']

最佳答案

问题是使用 .ix[] 会返回一个 View 到 DataFrame 的那个子集的实际内存对象,而不是一个由其内容组成的新 DataFrame。

改为使用

# The left-hand-side does not use .ix, since we're assigning into it.
df[['b','c']] = df.ix[:,'e':'f'].copy()

请注意,如果您打算使用 .ix 进行切片,您将需要 .copy(),否则它会设置列 'b' 和 'c ' 与列“e”和“f”内存中的相同对象,这看起来不像您想在此处执行的操作。

或者,为了避免被抄袭,您可以这样做:

df[['b','c']] = df[['e','f']]

如果索引的便利性对您很重要,模拟这种效果的一种方法是编写您自己的函数:

def col_range(df, col1, col2): 
return list(dfrm.ix[dfrm.index.values[0],col1:col2].index)

现在您可以执行以下操作:

df[col_range(df,'b','d')] = df.ix[:,'e':'g'].copy()

注意:在 col_range 的定义中,我使用了第一个索引,它将选择数据框的第一行。我这样做是因为查看整个数据框只是为了选择一系列列似乎很浪费,而一行可能无关紧要。由于以这种方式切片会产生一个系列,因此提取列的方法实际上是获取索引,然后我将它们作为列表返回。

为额外的行切片请求添加:

要在分配中指定一组行,您可以使用 .ix,但您只需要在右侧指定一个值矩阵。在右侧具有子 DataFrame 的结构会导致问题。

df.ix[0:4,col_range(df,'b','d')] = df.ix[0:4,'e':'g'].values

您可以将 [0:4] 替换为 [df.index.values[i]:df.index.values[j]] [df.index.values[i] for i in range(N)] 或什至使用 [df['a']>5] 等逻辑值仅获取行例如,'a' 列超过 5。

您希望“a”列大于 5 且“e”列小于 10 的逻辑索引示例的完整切片可能如下所示:

import numpy as np
my_rows = np.logical_and(df['a'] > 5), df['e'] < 10)
df.ix[my_rows,col_range(df,'b','d')] = df.ix[my_rows,'e':'g'].values

在许多情况下,您不需要在左侧使用 .ix(我建议不要使用它,因为它只在某些情况下有效,而在其他情况下无效)。例如,像这样的东西:

df["A"] = np.repeat(False, len(df))
df["A"][df["B"] > 0] = True

将按原样工作,不需要特殊的 .ix 来识别条件为真的行。 .ix 好像右边的东西比较复杂,左边的好像也需要。

关于python - Pandas 高级索引分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11470105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com