gam*_*int 21 python dataframe pandas
我希望能够在Pandas DataFrame中计算数据的描述性统计数据,但我只关心重复的条目.例如,假设我创建了DataFrame:
import pandas as pd
data={'key1':[1,2,3,1,2,3,2,2],'key2':[2,2,1,2,2,4,2,2],'data':[5,6,2,6,1,6,2,8]}
frame=pd.DataFrame(data,columns=['key1','key2','data'])
print frame
key1 key2 data
0 1 2 5
1 2 2 6
2 3 1 2
3 1 2 6
4 2 2 1
5 3 4 6
6 2 2 2
7 2 2 8
Run Code Online (Sandbox Code Playgroud)
如您所见,行0,1,3,4,6和7都是重复的(使用'key1'和'key2'.但是,如果我将这个DataFrame索引如下:
frame[frame.duplicated(['key1','key2'])]
Run Code Online (Sandbox Code Playgroud)
我明白了
key1 key2 data
3 1 2 6
4 2 2 1
6 2 2 2
7 2 2 8
Run Code Online (Sandbox Code Playgroud)
(即,第一行和第二行不会显示,因为它们没有通过重复方法索引为True).
这是我的第一个问题.我的第二个问题涉及如何从这些信息中提取描述性统计数据.暂时忘记丢失的副本,假设我想为重复的条目计算.min()和.max()(这样我就可以得到一个范围).我可以在groupby对象上使用groupby和这些方法,如下所示:
a.groupby(['key1','key2']).min()
Run Code Online (Sandbox Code Playgroud)
这使
key1 key2 data
key1 key2
1 2 1 2 6
2 2 2 2 1
Run Code Online (Sandbox Code Playgroud)
我想要的数据显然在这里,但是提取它的最佳方式是什么?如何索引生成的对象以获得我想要的内容(key1,key2,数据信息)?
Yoe*_*oel 28
编辑Pandas 0.17或更高版本:
由于take_last该参数的duplicated()方法,不建议使用有利于新的keep论点,因为熊猫0.17,请参考此答案为正确的做法:
duplicated()用keep=False,调用方法,即frame.duplicated(['key1', 'key2'], keep=False).因此,为了提取此特定问题所需的数据,以下内容足够:
In [81]: frame[frame.duplicated(['key1', 'key2'], keep=False)].groupby(('key1', 'key2')).min()
Out[81]:
data
key1 key2
1 2 5
2 2 1
[2 rows x 1 columns]
Run Code Online (Sandbox Code Playgroud)
有趣的是,Pandas 0.17的这种变化可能部分归因于这个问题,正如本期所述.
对于Pandas 0.17之前的版本:
我们可以使用方法的take_last参数duplicated():
take_last:boolean,默认False对于一组不同的重复行,将除最后一行之外的所有行标记为重复行.默认值是除标记第一行以外的所有行.
如果我们将take_last值设置为True,则标记除最后一个重复行之外的所有行.将此及其默认值(False除了第一个重复行之外的所有标记)组合在一起,允许我们标记所有重复的行:
In [76]: frame.duplicated(['key1', 'key2'])
Out[76]:
0 False
1 False
2 False
3 True
4 True
5 False
6 True
7 True
dtype: bool
In [77]: frame.duplicated(['key1', 'key2'], take_last=True)
Out[77]:
0 True
1 True
2 False
3 False
4 True
5 False
6 True
7 False
dtype: bool
In [78]: frame.duplicated(['key1', 'key2'], take_last=True) | frame.duplicated(['key1', 'key2'])
Out[78]:
0 True
1 True
2 False
3 True
4 True
5 False
6 True
7 True
dtype: bool
In [79]: frame[frame.duplicated(['key1', 'key2'], take_last=True) | frame.duplicated(['key1', 'key2'])]
Out[79]:
key1 key2 data
0 1 2 5
1 2 2 6
3 1 2 6
4 2 2 1
6 2 2 2
7 2 2 8
[6 rows x 3 columns]
Run Code Online (Sandbox Code Playgroud)
现在我们只需要使用groupby和min方法,我相信输出是所需的格式:
In [81]: frame[frame.duplicated(['key1', 'key2'], take_last=True) | frame.duplicated(['key1', 'key2'])].groupby(('key1', 'key2')).min()
Out[81]:
data
key1 key2
1 2 5
2 2 1
[2 rows x 1 columns]
Run Code Online (Sandbox Code Playgroud)
use*_*666 12
要获得Pandas版本0.17的所有重复条目的列表,您只需在重复的函数中设置'keep = False'即可.
frame[frame.duplicated(['key1','key2'],keep=False)]
key1 key2 data
0 1 2 5
1 2 2 6
3 1 2 6
4 2 2 1
6 2 2 2
7 2 2 8
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
38060 次 |
| 最近记录: |