在多个列条件下屏蔽DataFrame - 在循环内部

时间:2016-11-30 17:55:01

标签: python pandas

我想在循环内的多个列上屏蔽我的数据帧。我想做这样的事情:

df = pd.DataFrame({'0': ['a']*3 + ['b']*3 + ['c']*3,
                   '1': ['a']*3 + ['b']*6,
                   '2': ['b']*4 + ['c']*5,
                   '3': ['c']*5 + ['d']*4})

请注意,上面写的第二个条件在循环的第一次迭代中不存在,因为没有item [1]元素。

以下是欢迎您测试的示例数据框:

eval

我提出的唯一解决方案是使用<!-- FOOTER ICON TABS --> <div data-role="footer" data-position="fixed" data-tap-toggle="false"> <div class="footer" data-role="navbar"> <ul> <li> <a href="#dashboard" data-icon="dashboard" class="ui-btn-active" id="icon-dashboard"> <span class="navbar-text">Dashboard</span> </a> </li> <li> <a href="#" data-icon="progress" id="icon-progress"> <span class="navbar-text">Voortgang</span> </a> </li> <li> <a href="#map" data-icon="security" id="icon-security"> <span class="navbar-text">Plattegrond</span> </a> </li> <li> <a href="#" data-icon="security" id="icon-security"> <span class="navbar-text">Securitycheck</span> </a> </li> </ul> </div> </div> ,我非常希望避免这种解决方案。

2 个答案:

答案 0 :(得分:0)

如果您将DataFrame分组为仅包含要用于比较的列(正如您在示例中所做的那样),并且val_dict中的键与你要比较的列,那么你可以让Pandas为你做这个。

对您的df

稍作修改
df = pd.DataFrame({0: ['a']*3 + ['b']*3 + ['c']*3,
                   1: ['a']*3 + ['d']*6,
                   2: ['b']*4 + ['c']*5,
                   3: ['c']*5 + ['a']*4})

您现在可以通过以下

完成您想要的任务
dfs = []
val_dict = {0: 'a', 1: 'b', 2: 'c', 3: 'd'}
val_series = pd.Series(val_dict)

for i in range(4):
    mask = (df == val_series).all(axis=1)
    dfs.append(df[mask])

修改 我正在离开我原来的解决方案,即使它解决了与OP打算解决的不同问题。预期的问题可以通过以下方式解决:

mask = True
for key in range(4):
    mask &= df[key] == val_dict[key]
    dfs.append(df[mask])

同样,这是使用我之前在原始答案中使用的修改后的df

答案 1 :(得分:0)

我将分享我的eval解决方案。

for i in range(4):
    items = [val_dict[i] for i in range(i+1)]
    df_ = eval('df[(' + ') & ('.join(['df["'+str(j)+'"] == items['+str(j)+']' for j in range(i+1)]) + ')]')
    dfs.append(df_)

它有效...但是太丑了:(