【发布时间】:2017-11-06 05:43:21
【问题描述】:
我想根据现有列向 DataFrame 添加一个新列。新列只是三列的三个值的元组:
df0.shape
# (5410185, 17)
new_col = pd.Series(list(zip(df0['a'], df0['b'], df0['c'])))
new_col.shape
# (5410185,)
new_col.isnull().sum()
# 0
df0['abc'] = new_col
df0['abc'].isnull().sum()
# 14334
我在示例 df 上尝试了相同的方法,它按预期工作:
test = pd.DataFrame(np.random.randint(0,1000,100000000).reshape(1000000,100))
test['new'] = pd.Series(list(zip(test[1], test[2], test[3])))
test['new'].isnull().sum()
# 0
'assign' 也产生相同的结果:
df0 = df0.assign(new_col2 = pd.Series(list(zip(df0['a'], df0['b'], df0['c']))))
df0['new_col2'].isnull().sum()
# 14334
我发现了两个类似的问题,this 和 this。我怀疑我的问题也与索引有关。似乎有 89 个不相同的值:
np.sum(df0.index == new_col.index)
# 89
分配与df0的索引相同的Series:
df0.index = new_col
df0['abc'] = df0.index
df0['abc'].isnull().sum()
# 0
更新 以下是@jezreal 解决方案的一些基准测试:
%time df0['abc'] = pd.Series(list(zip(df0['a'], df0['b'], df0['c'])), index=df0.index)
Wall time: 2.32 s
% time df0['abc'] = df0[['a','b','c']].apply(tuple, axis=1)
Wall time: 1min 42s
%time df0['abc'] = df0.set_index(['a','b','c']).index.values
Wall time: 8.68 s
% time df0['abc'] = pd.Series([tuple(x) for x in df0[['a','b','c']].values.tolist()], index=df0.index)
Wall time: 9.83 s
【问题讨论】: