循环并通过多索引的子集选择行

时间:2018-11-05 03:36:53

标签: python pandas dataframe

我有一个带有多个索引的数据框,我想在这个数据框周围循环,以提取出行组进行处理。

我想遍历多索引中的所有组合,但要查找索引的子集,而不是全部。我事先不知道键/索引值是多少,但我确实知道有多少。

例如:

                  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]

1 个答案:

答案 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进行了分组,然后,您将创建一个字典,其中包含这些键的每种组合的数据框。它们将被标记为key2df0,等等...您可以看到使用以下命令创建的所有数据框:

df1

您可以像访问任何普通词典值一样访问它们:

>>> dfs.keys()
dict_keys(['df0', 'df1', 'df2'])