如何使用pandas和Python 3计算数据框中唯一条目的数量

时间:2018-12-31 10:15:37

标签: python-3.x pandas dataframe

我有一个数据框,该数据框已简化为一个名为Filename的列(已按顺序排序),其中包含一个文件名列表,这些文件名可以重复也可以不重复。

例如

Filename
/dir1/dir2/abc.jpg
/dir1/dir2/abc.jpg
/dir1/dir2/def.jpg
/dir1/dir2/hij.jpg
/dir1/dir2/hij.jpg
/dir1/dir2/hij.jpg
/dir1/dir2/hij.jpg
/dir1/dir2/hij.jpg
/dir1/dir2/klm.jpg
/dir1/dir2/klm.jpg

我正在尝试使用python 3.6和pandas来获取每个文件名的出现次数 输出应为数据框,示例如下所示

Filename        Instances
/dir1/dir2/abc.jpg  2
/dir1/dir2/def.jpg  1
/dir1/dir2/hij.jpg  5
/dir1/dir2/klm.jpg  2

我已经找到了一种方法来执行此操作,方法是转换为列表然后计数,但是我想将其保留为数据帧,因为它将被抽回到某些机器学习中,并往返于列表,然后再返回似乎是一条糟糕的路线

我尝试过类似的代码

df = df.groupby('FileName')
df.groupby(['FileName']).count()
df = df.groupby('FileName').nunique()

,但似乎没有任何作用。 过去已经定义了15列的数据框,并使用类似的代码删除了它们

df = df.drop(['Column1Name', 'Column2Name',], axis=1)

上面的示例仅删除2列(为简单起见),但在现实生活中,只有14列被输入 因此,我想知道这是否是事实,或者我还没有确定一个新的名为“数量”(用于存储所计数的数量)的列是否与之有关。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

您可以尝试这样。

  

使用 pandas.DataFrame.groupby()

>>> import pandas as pd
>>>
>>> s = """/dir1/dir2/abc.jpg
... /dir1/dir2/abc.jpg
... /dir1/dir2/def.jpg
... /dir1/dir2/hij.jpg
... /dir1/dir2/hij.jpg
... /dir1/dir2/hij.jpg
... /dir1/dir2/hij.jpg
... /dir1/dir2/hij.jpg
... /dir1/dir2/klm.jpg
... /dir1/dir2/klm.jpg"""
>>>
>>> filenames = s.split('\n')
>>> filenames
['/dir1/dir2/abc.jpg', '/dir1/dir2/abc.jpg', '/dir1/dir2/def.jpg', '/dir1/dir2/hij.jpg', '/dir1/dir2/hij.jpg', '/dir1/dir2/hij.jpg', '/dir1/dir2/hij.jpg', '/dir1/dir2/hij.jpg', '/dir1/dir2/klm.jpg', '/dir1/dir2/klm.jpg']
>>>
>>> df = pd.DataFrame(d)
>>> df
             Filename
0  /dir1/dir2/abc.jpg
1  /dir1/dir2/abc.jpg
2  /dir1/dir2/def.jpg
3  /dir1/dir2/hij.jpg
4  /dir1/dir2/klm.jpg
5  /dir1/dir2/klm.jpg
>>>
>>> d = {"Filename": filenames}
>>> df = pd.DataFrame(d)
>>>
>>> df
             Filename
0  /dir1/dir2/abc.jpg
1  /dir1/dir2/abc.jpg
2  /dir1/dir2/def.jpg
3  /dir1/dir2/hij.jpg
4  /dir1/dir2/hij.jpg
5  /dir1/dir2/hij.jpg
6  /dir1/dir2/hij.jpg
7  /dir1/dir2/hij.jpg
8  /dir1/dir2/klm.jpg
9  /dir1/dir2/klm.jpg
>>>
>>> groups = df.groupby('Filename').groups
>>> groups
{'/dir1/dir2/abc.jpg': Int64Index([0, 1], dtype='int64'), '/dir1/dir2/def.jpg': Int64Index([2], dtype='int64'), '/dir1/dir2/hij.jpg': Int64Index([3, 4, 5, 6, 7], dtype='int64'), '/dir1/dir2/klm.jpg': Int64Index([8, 9], dtype='int64')}
>>>
>>> instances = []
>>> filenames = []
>>>
>>> for group in groups:
...     instances.append(len(groups[group]))
...     filenames.append(group)
...
>>> df = pd.DataFrame({"Filename": filenames, "Instances": instances})
>>> df
             Filename  Instances
0  /dir1/dir2/abc.jpg          2
1  /dir1/dir2/def.jpg          1
2  /dir1/dir2/hij.jpg          5
3  /dir1/dir2/klm.jpg          2
>>>