我想在循环内的多个列上屏蔽我的数据帧。我想做这样的事情:
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>
,我非常希望避免这种解决方案。
答案 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_)
它有效...但是太丑了:(