循环中的Isin函数无法正常运行

时间:2019-12-13 18:12:26

标签: python pandas for-loop

我有一个类似df的数据框

 X      Y

110     0
110     0
110     1
111     1
111     0
112     1
113     1
114     0

当我过滤datsframe进行len之类的操作并求和时一切正常,就像这里

new = df.x.isin([110,111])
df[new]
len(df[new].y) = 5
sum(df[new].y) = 2

但是,当我在循环内调用isin函数时,它将无法正常工作。

我有第二个数据帧df0之类的

col1 . col2

a     110,111
b     113
c     114,1114
d     267,118
e     956

我想遍历df0并执行len操作,并像在此循环中一样从df0.col2中调用df.x元素的组gr

for i in df0.index:
    gr = df0.get_value(i, 'col2')
    new = df.x.isin([gr])
    df_size = len(df[new].y)
    df_sum = sum(df[new].y)

问题在于,在gr = 110,111组中,元素111被忽略了

因此df_size = 3且df_sum = 1时应改为5和2

1 个答案:

答案 0 :(得分:1)

查看第一个代码示例的第一行:

new = df.x.isin([110,111])

isin 的参数是一个列表

然后在第二个代码示例中查看df.x.isin([gr])并注意 如果 gr 例如'111,112'(一个字符串),然后[gr]包含 ['111,112'],即包含单个元素的列表。 您用方括号“包围” gr 的事实不会拆分 gr

解决方案之一可能是转换 col2 通过以下方式:

df0.col2 = df0.col2.str.split(',')

,以便每个元素还包含一个列表(不是字符串)。

然后将第二个代码示例更改为:

for _, row in df0.iterrows():
    new = df[df.x.isin(row.col2)]
    df_size = new.y.size
    df_sum = new.y.sum()
    print(row.col2, df_size, df_sum)

在最终版本中,将 print 替换为您要处理的所有内容 变量。