我有一个带有多个索引的数据框,我想在这个数据框周围循环,以提取出行组进行处理。
我想遍历多索引中的所有组合,但要查找索引的子集,而不是全部。我事先不知道键/索引值是多少,但我确实知道有多少。
例如:
data1
key1 key2 key3
A A A 10
A A B 11
A B A 12
A B C 13
A C A 14
假设我只对key1 + key2感兴趣。
key1 + key2有3种独特的组合:
(A A)
(A B)
(A C)
我第一次要在循环中提取:
data1
key1 key2 key3
A A A 10
A A B 11
第二次要提取的循环:
data1
key1 key2 key3
A B A 12
A B C 13
我想提取循环中的第三次:
data1
key1 key2 key3
A C A 14
我该怎么做? 我是python的新手,所以解释得越多越好。
谢谢
**编辑以下评论**
在伪代码中,我本来是按照以下思路思考的:
[1] groups = <get the set/list of unique key1+key2 groups in the main dataframe>
[2] for each group in groups
[3] df_thisGroup = <extract the rows of data for this group from the main dataframe>
[4] <process df_thisGroup, and save the results out into a new dataframe. No need to alter the main dataframe>
[5] <optional: remove this group from the main dataframe as we no longer need it, we have finished processing it. This might make processing later groups faster?>
[6] move to next group
我的问题是如何执行步骤[1]和[2]和[3]
答案 0 :(得分:1)
您需要考虑如何存储数据帧。我会推荐一本字典。为了填充字典,您可以使用 { set disk_ssd_count = 0 }
{ set disk_sata_count = 0 }
{{ inventory_hostname }}:
{% if ansible_devices | length == 0 %}
rs: []
{% else %}
rs:
{% for disk in ansible_devices | sort %}
{% if disk | string | is_disk %}
{% if ansible_devices[disk]['rotational'] | disk_type == 'ssd' %}
{% set disk_ssd_count = disk_ssd_count + 1 %}
- { disk_name: {{ disk | string }}, disk_size: {{ ansible_devices[disk]['size'] }} }
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
pfd:
{% for disk in ansible_devices | sort %}
{% if disk | string | is_disk %}
{% if ansible_devices[disk]['rotational'] | disk_type == "sata" %}
- { disk_name: {{ disk | string }}, disk_size: {{ ansible_devices[disk]['size'] }} }
{% endif %}
{% endif %}
{% endfor %}
,并将groupby
参数设置为您所关注的键。
level
在这里,您已经按keys = ['key1','key2']
dfs = {f'df{i}': data for i, (g,data) in enumerate(df.groupby(level=keys))}
和key1
进行了分组,然后,您将创建一个字典,其中包含这些键的每种组合的数据框。它们将被标记为key2
,df0
,等等...您可以看到使用以下命令创建的所有数据框:
df1
您可以像访问任何普通词典值一样访问它们:
>>> dfs.keys()
dict_keys(['df0', 'df1', 'df2'])