假设我有以下数据帧:
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
。
您可以通过检查这些对象的shape
和ndmin
属性来确认这一点。
造成差异的原因是数据帧通常有 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))