我有这个循环
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,那么我希望它将它附加到我的源列表中然后我想创建一个名为:
的新coldf['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语句之后指定的。
答案 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.where
,indexing with str和isdigit
创建的掩码使用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