我有一个类似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
答案 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 替换为您要处理的所有内容 变量。