我有一个数据框,该数据框已简化为一个名为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列被输入 因此,我想知道这是否是事实,或者我还没有确定一个新的名为“数量”(用于存储所计数的数量)的列是否与之有关。
任何帮助将不胜感激
答案 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
>>>