根据不同列的布尔值添加新列

2 投票
2 回答
9881 浏览
提问于 2025-04-18 20:25

我想在一个数据表(DataFrame)中添加一个新列,这个新列的值是根据另一个列中的布尔值(真或假)来决定的。

假设有一个这样的数据表:

snr = DataFrame({ 'name': ['A', 'B', 'C', 'D', 'E'],  'seniority': [False, False, False, True, False] })

到目前为止,我的进展是这样的:

def refine_seniority(contact):
    contact['refined_seniority'] = 'Senior' if contact['seniority'] else 'Non-Senior'

snr.apply(refine_seniority)

但是我遇到了这个错误:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-208-0694ebf79a50> in <module>()
      2     contact['refined_seniority'] = 'Senior' if contact['seniority'] else 'Non-Senior'
      3 
----> 4 snr.apply(refine_seniority)
      5 
      6 snr

/usr/lib/python2.7/dist-packages/pandas/core/frame.pyc in apply(self, func, axis, broadcast, raw, args, **kwds )
   4414                     return self._apply_raw(f, axis)
   4415                 else:
-> 4416                     return self._apply_standard(f, axis)
   4417             else:
   4418                 return self._apply_broadcast(f, axis)

/usr/lib/python2.7/dist-packages/pandas/core/frame.pyc in _apply_standard(self, func, axis, ignore_failures)
   4489                     # no k defined yet
   4490                     pass
-> 4491                 raise e
   4492 
   4493 

KeyError: ('seniority', u'occurred at index name')

感觉我对数据表的基本理解有些欠缺,但我现在卡住了。

请问,如何才能正确地根据另一个列中的布尔值来添加新列呢?

2 个回答

1

在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在另一个地方使用这些数据。这个过程就像是把水从一个水桶倒到另一个水桶一样。

有些时候,我们会遇到一些问题,比如数据的格式不对,或者数据的类型不匹配。这就像是你想把牛奶倒进一个只适合倒水的瓶子里,结果牛奶就会洒得到处都是。

为了避免这些问题,我们可以使用一些工具和方法来确保数据在传递过程中是安全的、有效的。这样就能保证我们的程序能够顺利运行,而不会因为数据的问题而崩溃。

总之,处理数据就像是做一道菜,材料要准备好,步骤要清晰,这样才能做出美味的菜肴。

snr['refine_seniority']= snr['seniority'].map({True:'senior', False:'Non-senior'})
6

你可以创建一个字典,然后调用 map

In [176]:

temp = {True:'senior', False:'Non-senior'}
snr['refined_seniority'] = snr['seniority'].map(temp)
snr
Out[176]:
  name seniority refined_seniority
0    A     False        Non-senior
1    B     False        Non-senior
2    C     False        Non-senior
3    D      True            senior
4    E     False        Non-senior

正如用户 @Jeff 指出的那样,使用 mapapply 应该是最后的选择,如果可以用向量化的方法解决问题的话。

或者可以使用 numpy 的 where

In [178]:

snr['refined_seniority'] = np.where(snr['seniority'] == True, 'senior', 'Non-senior')
snr
Out[178]:
  name seniority refined_seniority
0    A     False        Non-senior
1    B     False        Non-senior
2    C     False        Non-senior
3    D      True            senior
4    E     False        Non-senior

如果你把你的函数修改成这样,它就能正常工作了:

In [187]:

def refine_seniority(contact):
    if contact == True:
        return 'senior'
    else:
        return 'Non-senior'

snr['refined_seniority'] = snr['seniority'].apply(refine_seniority)
snr
Out[187]:
  name seniority refined_seniority
0    A     False        Non-senior
1    B     False        Non-senior
2    C     False        Non-senior
3    D      True            senior
4    E     False        Non-senior

你写的代码是错误的,你在对数据框(df)调用 apply,但你用的列名并不存在,见下文:

In [193]:

def refine_seniority(contact):
    print(contact)


snr['refined_seniority'] = snr.apply(refine_seniority)

0    A
1    B
2    C
3    D
4    E
Name: name, dtype: object
0    False
1    False
2    False
3     True
4    False
Name: seniority, dtype: object

在这里你可以看到它输出了两个 pandas 系列,但没有 'seniority' 这个键值,所以出现了错误。

撰写回答