我正在使用Pandas和Python导入一个CSV,并且对导入的dataframe中的数据进行操作,从而生成一个新的列。
新列中的每一行都是根据A列和B列的对应行中的值生成的。在dataframe中有更多的列具有数据,但是这些列与下面的代码无关。
导入的dataframe有几千行。
A列和B列都包含0和99之间的数值。
将熊猫作为pd导入
import csv
df = pd.read_csv("import.csv", names=["Id", "Month", "Name", "ColA", "ColB" ])
def f(row):
if row['colA'].isin([10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 48]) and row['colB'].isin([30, 31, 32, 33, 34, 35, 57, 58]):
val = row['ColA']
elif row['ColB'].isin([10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 48]) and row['ColA'].isin([30, 31, 32, 33, 34, 35, 57, 58]):
val = row['ColB']
elif row['ColA'] > row['ColB']:
val = row['ColA']
elif row['ColA'] < row['ColB']:
val = row['ColB']
else:
val = row['ColA']
return val
df['NewColumnName'] = df.apply(f, axis=1)
df.to_csv("export.csv", encoding='utf-8')运行上述代码将返回错误:
AttributeError: ("'float' object has no attribute 'isin'", 'occurred at index 0')因此,显然不能以这种方式使用.isin()。对如何解决这个问题有什么建议吗?
使用Jezrael的方法,编辑添加了一个适用相同条件的列,代码如下所示:
m1 = (df['colA'].isin(L1) & df['colB'].isin(L2)) | (df['ColA'] > df['ColB'])
m2 = (df['colB'].isin(L1) & df['colA'].isin(L2)) | (df['ColA'] < df['ColB'])
m3 = (df['colC'].isin(L1) & df['colB'].isin(L2)) | (df['ColC'] > df['ColB'])
m4 = (df['colB'].isin(L1) & df['colC'].isin(L2)) | (df['ColC'] < df['ColB'])
m5 = (df['colC'].isin(L1) & df['colA'].isin(L2)) | (df['ColC'] > df['ColA'])
m6 = (df['colA'].isin(L1) & df['colC'].isin(L2)) | (df['ColC'] < df['ColA'])
df['NewColumnName'] = np.select([m1, m2, m3, m4, m5, m6], [df['ColA'], df['ColB'], df['ColC'], df['ColA'], df['ColB'], df['ColC'],], default=df['ColA'])发布于 2018-02-18 14:44:29
在熊猫中,最好的方法是避免循环,所以最好是用numpy.select和&的链式条件来表示AND和| for OR。
L1 = [10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 48]
L2 = [30, 31, 32, 33, 34, 35, 57, 58]
m1 = (df['colA'].isin(L1) & df['colB'].isin(L2)) | (df['ColA'] > df['ColB'])
m2 = (df['colB'].isin(L1) & df['colA'].isin(L2)) | (df['ColA'] < df['ColB'])
df['NewColumnName'] = np.select([m1, m2], [df['ColA'], df['ColB']], default=df['ColA'])发布于 2018-02-18 14:49:03
你需要像这样使用它:
df[df['ColA'].isin([10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 48])]这将给出ColA值位于上面所示列表中的行。您正在尝试按值执行此操作,但是此方法适用于整个列。如果您想要查看这个列表中是否有一个值,那么可以使用numpy在函数中编写类似的内容:
if np.any(row['colA'] == [10, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 48]):
val = row['ColA']https://stackoverflow.com/questions/48852855
复制相似问题