熊猫数据框删除了很多行

时间:2019-01-24 17:26:28

标签: python pandas dataframe twitter

我有一个带有很多推文的数据框,我想删除重复项。这些推文存储在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)

2 个答案:

答案 0 :(得分:1)

注意

Graipher的解决方案告诉您如何生成唯一的数据框。我的答案告诉您为什么您当前的操作会删除太多行(针对您的问题)。

END NOTE

输入“ 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")