Pandas Dataframe удаляет много строк - PullRequest
0 голосов
/ 24 января 2019

У меня есть датафрейм с большим количеством твитов, и я хочу удалить дубликаты. Твиты хранятся в 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 голосов
/ 24 января 2019

В pandas обычно всегда есть лучший способ, чем перебирать кадр данных с помощью цикла for.

В этом случае вам действительно нужно сгруппировать одинаковые твиты и просто сохранить первый. Это может быть достигнуто с помощью 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")
0 голосов
/ 24 января 2019

ПРИМЕЧАНИЕ

Решение Graipher расскажет вам, как создать уникальный фрейм данных.Мой ответ говорит вам, почему ваша текущая операция удаляет слишком много строк (по вашему вопросу).

END NOTE

Когда вы вводите оператор "else" для удаления дублированного твита, вы удаляете ВСЕ изстроки, которые имеют указанный твит.Давайте продемонстрируем:

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
...