循环并制作新的列python

时间:2017-05-19 17:21:25

标签: python loops pandas dataframe

我有这个循环

Source= []
for row in df['Num_Col']:
    if row[0:6].isdigit()==True and row[6:8].isalpha()==True:
        Source.append('Num')
        df['Source'] = Source

我想要实现的是当我遍历指定的列时,如果它们是数字,我希望它查看前6个位置,如果最后两个数字是alpha,那么我希望它将它附加到我的源列表中然后我想创建一个名为:

的新col
df['Source'] = Source

这将满足我的if语句的要求。我不断收到此错误

ValueError: Length of values does not match length of index

我很好,如果这个新列中的其余列是Nan,我只是希望它使用if语句指定的参数创建列。我只是不明白它为什么不这样做。

     Num_col   Country 
  1  123456HK  Georgia   
  2  273HH123  Georgia
  3  123456HK  Georgia
  4  273HH123  Georgia
  5  123456HK  Georgia

因此,当我运行该循环时,我希望它返回的是

     Num_col   Country   Source
  1  123456HK  Georgia   Num
  2  273HH123  Georgia   
  3  123456HK  Georgia   Num
  4  273HH123  Georgia   
  5  123456HK  Georgia   Num

所以基本上只需添加一个名为source的列,然后只添加与列中if语句匹配的值,其中指定的名称为Num,它是在if语句之后指定的。

3 个答案:

答案 0 :(得分:3)

您可以使用apply函数迭代Num_col列的所有行并应用函数。在这种情况下,函数会检查您指定的条件,并根据条件是否满足返回不同的值。

import numpy as np # for the np.NaN value
df['Source'] = df['Num_col'].apply(lambda nc: 'Num' if nc[0:6].isdigit() and nc[6:8].isalpha() else np.NaN)

# Output:
   Country   Num_col Source
0  Georgia  123456HK    Num
1  Georgia  273HH123    NaN
2  Georgia  123456HK    Num
3  Georgia  273HH123    NaN
4  Georgia  123456HK    Num

答案 1 :(得分:2)

我没有测试你的代码,因为我没有数据,但看起来你每次都试图设置源代码。这没有意义,因为Source数组(类btw的保留大写)与数据框列大小不匹配。

因此,您应该在构造结束时应用新列。类似的东西:

Source= []
for row in df['Num_Col']:
    if row[0:6].isdigit()==True and row[6:8].isalpha()==True:
        Source.append('Num')
    else:
        Source.append('')

df['Source'] = Source

更好!你可以映射!

def determine_num(row):
    if row[0:6].isdigit()==True and row[6:8].isalpha()==True:
        return 'Num'
    return ''

df['Source'] = df['Num_Col'].apply(determine_num)

完整的函数比lambdas更具可读性

答案 2 :(得分:0)

最好是使用numpy.whereindexing with strisdigit创建的掩码使用isalpha

mask = df['Num_col'].str[0:6].str.isdigit() & df['Num_col'].str[6:8].str.isalpha()
df['Source'] = np.where(mask, 'Num', '')
print (df)
    Num_col  Country Source
1  123456HK  Georgia    Num
2  273HH123  Georgia       
3  123456HK  Georgia    Num
4  273HH123  Georgia       
5  123456HK  Georgia    Num

对于nan s:

df.loc[mask, 'Source'] = 'Num'
print (df)
    Num_col  Country Source
1  123456HK  Georgia    Num
2  273HH123  Georgia    NaN
3  123456HK  Georgia    Num
4  273HH123  Georgia    NaN
5  123456HK  Georgia    Num