我有一个带有很多推文的数据框,我想删除重复项。这些推文存储在fh1.df ['Tweets']中。我计算非重复的数量。 j重复项的数量。在else语句中,我删除重复的行。如果我创建了一个新列表“ tweetChecklist”,则将所有好的推文都放入其中。
好吧,如果我执行i + j,我将成为原始推文。这样很好。但是在其他情况下,我不知道为什么,他删除了很多行,因为在for循环(1/10)之后,我的数据框的形状小得多。
“ fh1.df = fh1.df [fh1.df.Tweets!= current_tweet]如何 “行删除了很多行?
tweetChecklist = []
for current_tweet in fh1.df['Tweets']:
if current_tweet not in tweetChecklist:
i = i + 1
tweetChecklist.append(current_tweet)
else:
j = j + 1
fh1.df = fh1.df[fh1.df.Tweets != current_tweet]
fh1.df['Tweets'] = pd.Series(tweetChecklist)
答案 0 :(得分:1)
Graipher的解决方案告诉您如何生成唯一的数据框。我的答案告诉您为什么您当前的操作会删除太多行(针对您的问题)。
输入“ else”语句以删除重复的tweet时,将删除所有具有指定tweet的行。让我们演示一下:
import numpy as np
import pandas as pd
df = pd.DataFrame(data=np.random.randint(0, 10, (10, 5)), columns=list('ABCDE'))
这是什么意思:
Out[118]:
A B C D E
0 2 7 0 5 4
1 2 8 8 3 7
2 9 7 4 6 2
3 9 7 7 9 2
4 6 5 7 6 8
5 8 8 7 6 7
6 6 1 4 5 3
7 1 4 7 8 7
8 3 2 5 8 5
9 5 8 9 2 4
在您的方法中(假设您要从“ A”中删除重复项,而不是“ Tweets”),您将得到(即,只有不唯一的行)。
Out[118]:
A B C D E
5 8 8 7 6 7
7 1 4 7 8 7
8 3 2 5 8 5
9 5 8 9 2 4
如果您只想使其独特,请执行Graipher的建议。如果要计算有多少重复,可以执行以下操作:
total = df.shape[0]
duplicates = total - df.A.unique().size
答案 1 :(得分:1)
在pandas
中,总有比通过for
循环遍历数据帧更好的方法。
在这种情况下,您真正想要的是将相等的tweet分组在一起,并保留第一个。这可以通过pandas.DataFrame.groupby
来实现:
import random
import string
import pandas as pd
# some random one character tweets, so there are many duplicates
df = pd.DataFrame({"Tweets": random.choices(string.ascii_lowercase, k=100),
"Data": [random.random() for _ in range(100)]})
df.groupby("Tweets", as_index=False).first()
# Tweets Data
# 0 a 0.327766
# 1 b 0.677697
# 2 c 0.517186
# 3 d 0.925312
# 4 e 0.748902
# 5 f 0.353826
# 6 g 0.991566
# 7 h 0.761849
# 8 i 0.488769
# 9 j 0.501704
# 10 k 0.737816
# 11 l 0.428117
# 12 m 0.650945
# 13 n 0.530866
# 14 o 0.337835
# 15 p 0.567097
# 16 q 0.130282
# 17 r 0.619664
# 18 s 0.365220
# 19 t 0.005407
# 20 u 0.905659
# 21 v 0.495603
# 22 w 0.511894
# 23 x 0.094989
# 24 y 0.089003
# 25 z 0.511532
甚至更好,甚至有一个明确的函数pandas.drop_duplicates
,它的速度大约是它的两倍:
df.drop_duplicates(subset="Tweets", keep="first")