【问题标题】:Python function reading lengths not workingPython函数读取长度不起作用
【发布时间】:2018-10-05 12:45:17
【问题描述】:

我正在尝试开发一个检查 VIN 长度并返回输出的函数。

为了测试,如果长度 = 17,我让它打印出 vin。但是,它清楚地打印出所有内容。不知道我做错了什么。

下面的代码示例。

import pandas as pd

#initialization
df = pd.DataFrame(columns = ["vin"], data = ['LHJLC79U58B001633','SZC84294845693987','LFGTCKPA665700387','L8YTCKPV49Y010001',
                                         'LJ4TCBPV27Y010217','LFGTCKPM481006270','LFGTCKPM581004253','LTBPN8J00DC003107',
                                         '1A9LPEER3FC596536','1A9LREAR5FC596814','1A9LKEER2GC596611','1A9L0EAH9C596099',
                                         '22A000018'])

df['manufacturer'] = ['A','A','A','A','B','B','B','B','B','C','C','D','D']

#develop function
def check_vin(df):
    if len(df['vin'][1]) == 17:
        print(df['vin'])
    else:
        print('nogo')


#test the function
for index, row in df.iterrows():
    check_vin(df)

【问题讨论】:

    标签: python python-3.x pandas function


    【解决方案1】:

    那是因为您在每次迭代中都要求相同事物的长度 (df['vin'][1])

    改成

    for index, row in df.iterrows():
       check_vin(row)
    

    def check_vin(r):
        if len(r.vin) == 17:
            print(r)
        else:
            print('nogo')
    

    输出

    LHJLC79U58B001633
    SZC84294845693987
    LFGTCKPA665700387
    L8YTCKPV49Y010001
    LJ4TCBPV27Y010217
    LFGTCKPM481006270
    LFGTCKPM581004253
    LTBPN8J00DC003107
    1A9LPEER3FC596536
    1A9LREAR5FC596814
    1A9LKEER2GC596611
    nogo
    nogo
    

    【讨论】:

      【解决方案2】:

      不要手动迭代行。您可以使用带条件逻辑的新列分配:

      df['check'] = np.where(df['vin'].str.len().eq(17), df['vin'], 'nogo')
      
      print(df)
      
                        vin manufacturer              check
      0   LHJLC79U58B001633            A  LHJLC79U58B001633
      1   SZC84294845693987            A  SZC84294845693987
      2   LFGTCKPA665700387            A  LFGTCKPA665700387
      3   L8YTCKPV49Y010001            A  L8YTCKPV49Y010001
      4   LJ4TCBPV27Y010217            B  LJ4TCBPV27Y010217
      5   LFGTCKPM481006270            B  LFGTCKPM481006270
      6   LFGTCKPM581004253            B  LFGTCKPM581004253
      7   LTBPN8J00DC003107            B  LTBPN8J00DC003107
      8   1A9LPEER3FC596536            B  1A9LPEER3FC596536
      9   1A9LREAR5FC596814            C  1A9LREAR5FC596814
      10  1A9LKEER2GC596611            C  1A9LKEER2GC596611
      11   1A9L0EAH9C596099            D               nogo
      12          22A000018            D               nogo
      

      【讨论】:

        【解决方案3】:

        您可以按以下方式定位您的 17 长度行

        condition = (df["vin"].str.len() == 17)
        print(df[condition])
        

        【讨论】:

        • 我应该多交流。这是更大功能迭代的一部分。如果 VIN == 17,它将执行另一个函数,如果不是,则将调用另一个函数。我需要 17 和非 17 长度的 VIN。
        • 要获得非 17 号,只需尝试 nogo = df[~condition]
        【解决方案4】:

        你只需要:

        df[df.vin.str.len()==17]
        

        【讨论】:

          猜你喜欢
          • 2014-11-01
          • 1970-01-01
          • 2017-09-12
          • 1970-01-01
          • 2012-04-22
          • 2017-07-27
          • 2014-11-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多