假设我有以下数据框:
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'
作为输入,因此我希望处理这两种情况。
答案 0 :(得分:0)
df['A']
是pd.Series
shape
(4,)和ndim
1。
df[['A']]
是pd.DataFrame
shape
(4,1)和ndim
2。
您可以通过查看这些对象的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))