从pandas dataframe获取索引列表

时间:2017-08-21 14:12:12

标签: python pandas dataframe

我试图从熊猫数据框中获取索引列表。

首先进行导入。

import pandas as pd

构建一个pandas数据帧。

# Create dataframe
data = {'name': ['Jason', 'Jason', 'Tina', 'Tina', 'Tina', 'Jason', 'Tina'],
        'reports': [4, 24, 31, 2, 3, 5, 10],
        'coverage': [True, False, False, False, True, True, False]}
df = pd.DataFrame(data)
print(df)

输出:

  coverage   name  reports
0     True  Jason        4
1    False  Jason       24
2    False   Tina       31
3    False   Tina        2
4     True   Tina        3
5     True  Jason        5
6    False   Tina       10

当coverage设置为True时,我希望数据框左侧有索引,但我希望单独为每个名称设置这个索引。最好在没有明确的for循环的情况下这样做。

所需的输出是这样的。

list_Jason = [0, 5]
list_Tina = [4]

尝试解决方案:我认为我应该使用' groupby'然后访问coverage列。从那里我不知道如何继续。感谢所有帮助。

df.groupby('name')['coverage']

3 个答案:

答案 0 :(得分:2)

您希望为每个组获取索引。

这存储在groupbydataframe的'groups'属性中。

#filter for coverage==True
#group by 'name'
#access the 'groups' attribute
by_person = df[df.coverage].groupby('name').groups

将返回:

{'Jason': Int64Index([0, 5], dtype='int64'),
 'Tina': Int64Index([4], dtype='int64')}

您可以像访问常规词典一样访问个人:

by_person['Jason']

返回:

Int64Index([0, 5], dtype='int64')

您可以像常规名单一样对待。

答案 1 :(得分:1)

这是可行的,首先使用boolean indexing,然后使用groupby:

In [942]: df[df.coverage].groupby('name').agg({'reports' : lambda x: list(x.index)})
Out[942]: 
      reports
name         
Jason  [0, 5]
Tina      [4]

您可以使用dfGroupBy.agg将输出作为列表列。

答案 2 :(得分:0)

这应该有效:

  grouped=df.groupby('name').apply(lambda x: x.index[x.coverage].values)

输出:

name
Jason    [0, 5]
Tina        [4]