我正在使用 Pandas 和 Python 导入一个 CSV,并对导入的数据框中的数据进行操作,以便创建一个新列。
新列中的每一行都是基于 A 列和 B 列的每个对应行中的值生成的。 数据框中有更多包含数据的列,但是这些与下面的代码无关。
导入的数据框有几千行。
A 列和 B 列均包含介于 0 和 99 之间(含)的数值。
将 pandas 导入为 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'])
最佳答案
在 pandas 中最好的是避免循环,所以更好的是使用 numpy.select
和 &
为 AND
和 |
为 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'])
关于python - Pandas :使用 .isin() 返回错误: "AttributeError: float' 对象没有属性 'isin'“,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48852855/