迭代组(Python pandas 数据框)
Iterating over groups (Python pandas dataframe)
我想遍历按字符串或日期分组的组。
df = pd.DataFrame({'A': ['foo', 'bar'] * 3,
'B': ['me', 'you', 'me'] * 2,
'C': [5, 2, 3, 4, 6, 9]})
groups = df.groupby('A')
例如,在这段代码中,我按名称 'foo' 和 'bar' 分组,我可以使用循环遍历它们;
for name, group in groups:
print name
我的问题是我需要在这个循环中 运行 另一个循环,并且每次我需要调用不同的组集。喜欢(假设组的大小为 n)
for name,group in groups:
for name1 in range(name, name + 9): # + 9 to get first 9 groups for every iteration`
因为名称是一个字符串,所以我无法做到这一点。 简而言之,我只是想要一种可以通过数字访问组的方法,以便我可以轻松调用所需的组进行计算。
像
groups = df.group('A')
for i in range(0,n):
print group(i)[] + group(i+1)[]
所以如果我有以下组 [g1,g2,g3,g4,g5],我想像 [g1,g2], [g2,g3], [g3,g4] 那样成对地迭代调用它们。 ...并且每次都取两组系列的交集。我正在寻找通过索引或某些编号来调用组 [g1,g2,..g5] 的方法。这样我就可以将它们用于循环操作。目前我知道调用组的唯一方法是通过组的名称,如上面示例 'foo' 和 'bar' 中所述。
我想要权力来做这样的操作:
for name,group in groups-1:
print gb.get_group(name)
print gb.get_group(name+1)
我知道这可能是一个简单的问题,但我已经为这部分苦苦挣扎了一段时间。我将不胜感激任何帮助。
.groupby()
对象有一个 .groups
属性,returns 一个 Python 索引字典。在这种情况下:
In [26]: df = pd.DataFrame({'A': ['foo', 'bar'] * 3,
....: 'B': ['me', 'you', 'me'] * 2,
....: 'C': [5, 2, 3, 4, 6, 9]})
In [27]: groups = df.groupby('A')
In [28]: groups.groups
Out[28]: {'bar': [1L, 3L, 5L], 'foo': [0L, 2L, 4L]}
您可以按如下方式对其进行迭代:
keys = groups.groups.keys()
for index in range(0, len(keys) - 1):
g1 = df.ix[groups.groups[keys[index]]]
g2 = df.ix[groups.groups[keys[index + 1]]]
# Do something with g1, g2
但是,请记住,使用 for
循环遍历 Pandas 对象通常比向量操作慢。根据您需要完成的工作,如果需要快速完成,您可能想尝试其他方法。
由于dict_keys
in Python 3 不可订阅,更改:
df.ix[groups.groups[keys[index]]]
至
df.ix[groups.groups[list(keys)[index]]]
我想遍历按字符串或日期分组的组。
df = pd.DataFrame({'A': ['foo', 'bar'] * 3,
'B': ['me', 'you', 'me'] * 2,
'C': [5, 2, 3, 4, 6, 9]})
groups = df.groupby('A')
例如,在这段代码中,我按名称 'foo' 和 'bar' 分组,我可以使用循环遍历它们;
for name, group in groups:
print name
我的问题是我需要在这个循环中 运行 另一个循环,并且每次我需要调用不同的组集。喜欢(假设组的大小为 n)
for name,group in groups:
for name1 in range(name, name + 9): # + 9 to get first 9 groups for every iteration`
因为名称是一个字符串,所以我无法做到这一点。 简而言之,我只是想要一种可以通过数字访问组的方法,以便我可以轻松调用所需的组进行计算。 像
groups = df.group('A')
for i in range(0,n):
print group(i)[] + group(i+1)[]
所以如果我有以下组 [g1,g2,g3,g4,g5],我想像 [g1,g2], [g2,g3], [g3,g4] 那样成对地迭代调用它们。 ...并且每次都取两组系列的交集。我正在寻找通过索引或某些编号来调用组 [g1,g2,..g5] 的方法。这样我就可以将它们用于循环操作。目前我知道调用组的唯一方法是通过组的名称,如上面示例 'foo' 和 'bar' 中所述。 我想要权力来做这样的操作:
for name,group in groups-1:
print gb.get_group(name)
print gb.get_group(name+1)
我知道这可能是一个简单的问题,但我已经为这部分苦苦挣扎了一段时间。我将不胜感激任何帮助。
.groupby()
对象有一个 .groups
属性,returns 一个 Python 索引字典。在这种情况下:
In [26]: df = pd.DataFrame({'A': ['foo', 'bar'] * 3,
....: 'B': ['me', 'you', 'me'] * 2,
....: 'C': [5, 2, 3, 4, 6, 9]})
In [27]: groups = df.groupby('A')
In [28]: groups.groups
Out[28]: {'bar': [1L, 3L, 5L], 'foo': [0L, 2L, 4L]}
您可以按如下方式对其进行迭代:
keys = groups.groups.keys()
for index in range(0, len(keys) - 1):
g1 = df.ix[groups.groups[keys[index]]]
g2 = df.ix[groups.groups[keys[index + 1]]]
# Do something with g1, g2
但是,请记住,使用 for
循环遍历 Pandas 对象通常比向量操作慢。根据您需要完成的工作,如果需要快速完成,您可能想尝试其他方法。
由于dict_keys
in Python 3 不可订阅,更改:
df.ix[groups.groups[keys[index]]]
至
df.ix[groups.groups[list(keys)[index]]]