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

时间:2018-04-06 09:29:11

标签: python pandas numpy dataframe

假设我有以下数据框:

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'作为输入,因此我希望处理这两种情况。

1 个答案:

答案 0 :(得分:0)

df['A']pd.Series shape(4,)和ndim 1。

df[['A']]pd.DataFrame shape(4,1)和ndim 2。

您可以通过查看这些对象的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))