pandas:将数据帧减少到只有特定的出现链

时间:2016-05-26 09:59:30

标签: python python-2.7 pandas dataframe

假设我有这些数据:

>>> data = {'event': [0,1,1,2,1,0],
...         'val1': [1, 2, 3, 4, 5, 6]
...         }
>>> df1 = pd.DataFrame(data, index = ['hash1', 'hash1', 'hash2',
                                      'hash3', 'hash3', 'hash3'])
>>> df1
       event  val1
hash1      0     1
hash1      1     2
hash2      1     3
hash3      2     4
hash3      1     5
hash3      0     6

我想做什么: 我想减少df,只显示有关哈希值的数据,这些哈希值至少有一次出现所有唯一的事件值。

所以最后我会得到一个如下所示的数据框:

       event   val1
hash3      2      4
hash3      1      5
hash3      0      6

我试图将数据帧拆分为等于零而不是大于零的事件,然后尝试从"等于零"查找索引。 "中的数据帧不等于零"数据框 - 但我对熊猫的表现非常糟糕。如果有人能帮助我实现这一目标,我将非常感激。 先谢谢你们!

1 个答案:

答案 0 :(得分:1)

您可以在索引上的groupby之前过滤df,然后使用nunique获取唯一事件的数量,并过滤具有多个唯一条目的哈希的orig df:< / p>

In [62]:
gp = df1[df1['event'] !=0].groupby(level=0)['event'].nunique()
df1.loc[gp[gp> 1].index]

Out[62]:
       event  val1
hash3      2     4
hash3      1     5
hash3      0     6

打破上述情况:

In [63]:
df1['event'] !=0

Out[63]:
hash1    False
hash1     True
hash2     True
hash3     True
hash3     True
hash3    False
Name: event, dtype: bool

In [64]:
df1[df1['event'] !=0]

Out[64]:
       event  val1
hash1      1     2
hash2      1     3
hash3      2     4
hash3      1     5

In [65]:
df1[df1['event'] !=0].groupby(level=0)['event'].nunique()

Out[65]:
hash1    1
hash2    1
hash3    2
Name: event, dtype: int64

In [66]:
gp[gp> 1]

Out[66]:
hash3    2
Name: event, dtype: int64

修改

根据您的更新,您可以将nunique值的长度与事件unique值的长度进行比较:

In [107]:
df1.loc[df1.groupby(level=0)['event'].nunique() == len(df1['event'].unique())]

Out[107]:
       event  val1
hash3      2     4
hash3      1     5
hash3      0     6