如何使用.loc语法创建新列?

时间:2019-10-11 14:13:52

标签: python pandas dataframe

我有一个数据框中存在的列名(cols)的列表。

我想在其他数据框中插入这些名称的列。

所以我正在使用for循环来迭代列表并一一创建列:

cols = ['DEPTID', 'ACCOUNT', 'JRNL LINE DESCRIPTION', 'JRNL DATE', 'BASE AMOUNT', 'FOREIGN CURRENCY', 'FOREIGN AMOUNT', 'JRNL SOURCE']
for col in cols:
    # "summary" and "obiee" are dataframes
    summary.loc[obiee['mapid'], col] = obiee[col].tolist()

不过,我想摆脱for循环。

因此,我尝试使用.loc语法进行多列分配:

cols = ['DEPTID', 'ACCOUNT', 'JRNL LINE DESCRIPTION', 'JRNL DATE', 'BASE AMOUNT', 'FOREIGN CURRENCY', 'FOREIGN AMOUNT', 'JRNL SOURCE']
summary.loc[obiee['mapid'], cols] = obiee[cols]

但是熊猫会抛出错误:

KeyError: "['DEPTID' 'ACCOUNT' 'JRNL LINE DESCRIPTION' 'JRNL DATE' 'BASE AMOUNT'\n 'FOREIGN CURRENCY' 'FOREIGN AMOUNT' 'JRNL SOURCE'] not in index"

使用此语法不可能吗?否则我该怎么办?

2 个答案:

答案 0 :(得分:1)

您有一个dataFrame df1 ..带有一些列...

并且您想要df2中的那些...您要做的就是将它们等同如下所示

df2 = pd.DataFrame({ 'A' : 1.,
   ....:                      'B' : pd.Timestamp('20130102'),
   ....:                      'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
   ....:                      'D' : np.array([3] * 4,dtype='int32'),
   ....:                      'E' : pd.Categorical(["test","train","test","train"]),
   ....:                      'F' : 'foo' })
df1 = pd.DataFrame({ 'G' : 1.,
   ....:                      'H' : pd.Timestamp('20130102'),
   ....:                      'I' : pd.Series(1,index=list(range(4)),dtype='float32'),
   ....:                      'J' : np.array([3] * 4,dtype='int32'),
   ....:                      'K' : pd.Categorical(["test","train","test","train"]),
   ....:                      'L' : 'foo' })
df2['G'],df2['F'] = df1['G'],df1['H']

答案 1 :(得分:1)

join

您可以创建一个新的数据框,然后创建join。根据问题描述和示例代码,'mapid'表示summary数据框中的索引值。使join在索引上合并。因此,通过将obiee的索引设置为'mapid'然后采用适当的列,我们可以只使用join

summary.join(obiee.set_index('mapid')[cols])