【问题标题】:Looking at the first character of a string for every element in a list查看列表中每个元素的字符串的第一个字符
【发布时间】:2020-06-21 15:11:14
【问题描述】:

我有一个 pandas 数据框,其中有一列名为“图片”;该列具有以数字或字母开头的值。我要做的是创建一个新列,检查值是否以字母或数字开头,并相应地填充该新列。我正在使用 np.where,我的代码如下(raw_master 是数据框,'database' 是新列):

def iaps_or_naps(x):
    if x in ["1","2","3","4","5","6","7","8","9"]:
        return True
    else:
        return False
raw_master['database'] = np.where(iaps_or_naps(raw_master.picture[?][0])==True, 'IAPS', 'NAPS')

我的问题是,如果我只做raw_master.picture[0],它会检查整个字符串的值,这不是我需要的。我需要第一个字符;但是,如果我执行raw_master.picture[0][0],则只会计算整个数据帧第一行的第一个字符。顺便说一句,问号只是意味着我不知道该放什么。

我怎样才能得到它,以便每行都使用字符串的第一个字符?

非常感谢!

【问题讨论】:

  • 您也不需要np.where 中的==Truenp.where 计算一个布尔值,如果条件为 True,则将传递给它的第一个字符串 ('IAPS') 分配为分配的值,如果条件为 false,则分配第二个字符串 'NAPS')。添加==True 是不必要的评估。

标签: python pandas


【解决方案1】:

您可以使用映射函数,例如 apply,它遍历列中的每个元素,这样可以访问索引为 [0] 的第一个字符

df['new_col'] = df['picture'].apply(lambda x: 'IAPS' if x[0].str.isdigit() else 'NAPS')

【讨论】:

    【解决方案2】:

    您不需要为此编写自己的函数。以这个小df为例:

     s = pd.DataFrame(['3asd', 'asd', '3423', 'a123'])
    

    看起来像:

          0
    0  3asd
    1   asd
    2  3423
    3  a123
    

    使用 pandas 内置函数:

    # checking first column, s[0], first letter, str[0], to see if it is digit.
    # if so, assigning IAPS, if not, assigning NAPS
     s['database'] = np.where(s[0].str[0].str.isdigit(), 'IAPS', 'NAPS')
    

    输出:

          0 database
    0  3asd     IAPS
    1   asd     NAPS
    2  3423     IAPS
    3  a123     NAPS
    

    将此应用于您的数据框:

    raw_master['database'] = np.where(raw_master['picture'].str[0].str.isdigit(), 'IAPS', 'NAPS')
    

    【讨论】:

    • 谢谢我的朋友!有效。那么,str[0] 部分在做什么呢?不熟悉该特定语法。它正在获取“图片”行中任何字符串的第一个字符?
    • @BrianWinston 完全正确!乐于助人。
    【解决方案3】:

    IIUC 您可以使用pd.to_numeric 测试第一个字符是否为 int

    np.where(pd.to_numeric(df['your_col'].str[0],errors='coerce').isnull(),'IAPS'   
    ,'NAPS')                                                             #  ^ not a number
      #^ number
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-20
      • 2012-05-21
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多