如果使用 open() 和 reader() 打开文件,则循环相同,但不适用于熊猫数据帧



我使用 open(( 和 read(( 在 jupyter notebook 中打开了一个文件。我使用 for 循环来查找重复项。它工作得很好。

我使用熊猫数据框打开了相同的文件。我之前使用的 for 循环不起作用。它没有产生任何结果。

熊猫中的 for 循环不会打印任何内容。


duplicate_apps = []
unique_apps = []
for app in android:
name = app[0]
if name in unique_apps:
duplicate_apps.append(name)
else:
unique_apps.append(name)
print('Number of duplicate apps:', len(duplicate_apps))
print('n')
print('Examples of duplicate apps:', duplicate_apps[:15])

当我使用 open((和 reader(( 时,这个循环运行良好,但当我使用 pandas 数据帧打开文件时,这个循环不起作用。

如果像这样循环访问数据帧:

for app in android:
name = app[0]
if name in unique_apps:
duplicate_apps.append(name)
else:
unique_apps.append(name)

变量app将循环访问列名。但是,如果要遍历名为name的列,则必须这样做:

for idx, row in android.iterrows():
name = row['name']
if name in unique_apps:
duplicate_apps.append(name)
else:
unique_apps.append(name)

但这不是在您的示例中执行此操作的最佳方法,您可以改为执行以下操作:

# create counts
counts= android.groupby(['name']).apply(len).reset_index()
counts.columns= ['name', 'count']
# get the duplicate names
counts.loc[counts['count']>1, 'name']
# get the unique names
counts.loc[counts['count']==1, 'name']

请注意,这并不完全等同于您的结果,因为在您的结果中,重复名称是唯一名称的子集。如果你真的想要它,你只需要将最后一行替换为

counts.loc[:, 'name']

例子:

android= pd.DataFrame(dict(name=['skype', 'notepad', 'messenger', 'notepad', 'play']))
# duplicates:
Out[522]: 
1    notepad
Name: name, dtype: object
# real unique values:
Out[523]: 
0    messenger
2         play
3        skype
Name: name, dtype: object

如果你想使用python列表,只需添加.to_list(),如:

counts.loc[counts['count']==1, 'name'].to_list()

最新更新