在括号内声明数据框列的名称时更新其内容



假设我有以下数据帧:

df = pd.DataFrame(np.zeros((4,3)),columns=['A','B','C'])
df
     A    B    C
0  0.0  0.0  0.0
1  0.0  0.0  0.0
2  0.0  0.0  0.0
3  0.0  0.0  0.0

假设现在我定义了一个新变量col来访问数据帧的特定列。我可以在括号内或括号外声明其值:

col_1 = 'A'
print df[col_1]
col_2 = ['A']
print df[col_2]

但是,当我尝试更新数据帧的内容时,只有df[col_1] = ...有效:

df[col_1] = np.ones(4)
print df

第二种情况将导致错误:

df[col_2] = np.ones(4)
print df

错误是 ValueError: shape mismatch: value array of shape (4,) could not be broadcast to indexing result of shape (1,4)

我希望这两种情况都有效,因为col是函数的参数。

上下文

我正在声明一个函数,我想创建一个新数据帧,其中包含数据帧X.columns的相同列和所有元素中的零,除了列cols(一列或两列(,其中它应该具有数组的值values(1D 或 2D 数组(。我是这样宣布的:

def create_X_grid(X, values, cols):
    n_rows = len(values)
    n_columns = len(X.columns)
    X_grid = pd.DataFrame(np.zeros((n_rows,n_columns)), columns=X.columns)
    X_grid[cols] = values
    return X_grid

用户可能会输入cols=['A']cols='A',因此我想处理这两种情况。

df['A'] 是具有 shape (4,( 和ndim 1 的pd.Series

df[['A']] 是具有 shape (4,1( 和 ndim 2 的pd.DataFrame

您可以通过检查这些对象的shapendmin属性来确认这一点。

造成差异的原因是数据帧通常有 2 个轴:axis=0 表示行,axis=1表示列。序列不需要这种区分。

因此,您可以分配维度为 1 的数组,例如 np.ones(4) ,到一个系列,但不是到数据帧。

您可能不需要使用的解决方法是更改numpy数组的形状:

import pandas as pd, numpy as np
df = pd.DataFrame(np.zeros((4,3)),columns=['A','B','C'])
df[['A']] = np.ones(4)[:, None]

为了处理这两种情况,我建议在处理之前将单个元素的列表转换为字符串并使用系列赋值。

lst = ['A']
res = lst[0]  # alternatively next(iter(lst))

最新更新