我希望您的语法也能正常工作。出现问题的原因是,当您使用column-list语法(
df[[new1, new2]] =...)创建新列时,pandas要求右侧为Dataframe(请注意,Dataframe的列是否具有与列相同的名称实际上并不重要您正在创建)。
您的语法可以很好地为 现有 列分配标量值,并且pandas也很乐意使用单列语法(
df[new1] =...)将标量值分配给新列。因此,解决方案是将其转换为几个单列分配,或者为右侧创建合适的Dataframe。
这里有几种方法是 将 工作:
import pandas as pdimport numpy as npdf = pd.Dataframe({ 'col_1': [0, 1, 2, 3], 'col_2': [4, 5, 6, 7]})
然后执行以下 *** 作之一:
1)使用列表拆包,将三个作业合二为一:2)df['column_new_1'], df['column_new_2'], df['column_new_3'] = [np.nan, 'dogs', 3]
Dataframe方便地扩展单个行以匹配索引,因此您可以执行以下 *** 作:
3)使用新列创建一个临时数据框,然后与原始数据框合并:df[['column_new_1', 'column_new_2', 'column_new_3']] = pd.Dataframe([[np.nan, 'dogs', 3]], index=df.index)
4)与之前类似,但使用df = pd.concat( [ df, pd.Dataframe( [[np.nan, 'dogs', 3]], index=df.index, columns=['column_new_1', 'column_new_2', 'column_new_3'] ) ], axis=1)
join代替
concat(可能效率较低):
5)使用dict比前两个更“自然”地创建新数据框,但是新列将按字母顺序排序(至少[在Pythondf = df.join(pd.Dataframe( [[np.nan, 'dogs', 3]], index=df.index, columns=['column_new_1', 'column_new_2', 'column_new_3']))
3.6或3.7之前](http://codingdict.com/questions/178055)):
6)df = df.join(pd.Dataframe( { 'column_new_1': np.nan, 'column_new_2': 'dogs', 'column_new_3': 3 }, index=df.index))
.assign()与多个列参数一起使用。
我非常喜欢@zero答案中的此变体,但与上一个一样,新列将始终按字母顺序排序,至少在早期版本的Python中:
df = df.assign(column_new_1=np.nan, column_new_2='dogs', column_new_3=3)
7)这很有趣,但是我不知道什么时候值得这样做:
8)最后,很难击败三个独立的任务:new_cols = ['column_new_1', 'column_new_2', 'column_new_3']new_vals = [np.nan, 'dogs', 3]df = df.reindex(columns=df.columns.tolist() + new_cols) # add empty colsdf[new_cols] = new_vals # multi-column assignment works for existing cols
df['column_new_1'] = np.nandf['column_new_2'] = 'dogs'df['column_new_3'] = 3
注意:这些选项中的许多选项已经包含在其他答案中:将多个列添加到Dataframe并将它们设置为与现有列相等,是否可以一次将多个列添加到pandasDataframe?,向pandasDataframe添加多个空列
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)