1
votes

Supprimer les lignes du bloc de données en fonction de la valeur des colonnes

J'ai un dataframe (tag) avec 9153 lignes et 3 colonnes. Voici les 5 premières lignes.

tweet_no=[]
for i in x.itertuples():
    if i.tweet==2:
        tweet_no.append(i.index)

Ce que j'essaie de faire, c'est de voir si un tweet reçoit deux balises et que ces balises sont différentes l'une de l'autre, comme celles-ci,

XXX

alors j'élimine ces tweets de la base de données. mais si tweet obtient deux balises similaires, acceptez tweet et ne sera pas supprimé. Pour résoudre ce problème, j'ai créé un nouveau bloc de données composé de tweet no. et son nombre de balises

   index    tweet
0   8252    15
1   9200    15
2   8646    13
3   8774    13
4   8322    13

ici les 5 premières lignes de x data frame, certains tweets reçoivent 3 balises ou même plus (jusqu'à 15) mais je ne suis concerné que par les tweets obtenus deux balises

x=pd.DataFrame(tag['tweet'].value_counts())
x.reset_index(inplace=True)

Ensuite, créez une liste contenant le tweet no. qui n'a que deux balises

          pk    tag     tweet
5287    5436    unknown 16600
8477    8626    real    16600

mais je suis resté sur la façon de comparer si les tweets ont des balises similaires ou différentes et supprimées si elles ont des balises différentes et acceptent si elles ont des balises similaires.


2 commentaires

Il pourrait être utile de clarifier ce que vous entendez par «similaire». Si vous voulez dire identique, alors vous pouvez simplement parcourir votre bloc de données d'origine en vérifiant les tweets à deux balises et en comparant les deux balises avec == . Si vous acceptez des balises de signification similaire ou d'épellation similaire, alors c'est un problème beaucoup plus compliqué.


Bienvenue à SO; si l'une des réponses ci-dessous a résolu votre problème, veuillez accepter (voir que dois-je faire lorsque quelqu'un répond à mon question? ), sinon veuillez laisser un commentaire.


3 Réponses :


0
votes

Essayez d'obtenir un nombre unique pour chaque tweet, puis éliminez si le nombre est supérieur à un

import pandas as pd

# your original data frame
original_data = pd.read_csv("your tweets csv file")

# Create temp data frame with only required columns
temp_data = original_data[["tweets", "tags"]]
temp_data = temp_data.groupby(["tweet"], as_index=False).agg({"tags": "nunique"})
# Tweet with only with a single
temp_data = temp_data[temp_data["tags"] == 1]["tweets"]

# Filter original data frame for the desired tweets
original_data = original_data[original_data["tweets"].isin(temp_data)]

=====================================
Sample example
data = pd.DataFrame(data={"tweet: [1, 2, 3, 1, 2, 3], "tags": ["a", "b", "c", "d", "b", "c"]})

data = data.groupby(["tweet"], as_index=False).agg({"tags": "nunique"})

# Tweet with only with a single
data = data[data["tags"] == 1]
=====================================

J'espère que cela résoudra votre problème


0 commentaires

0
votes

En supposant que similaire = le même, vous pouvez trouver un exemple ci-dessous:

df = pd.DataFrame({'tag': ['1', '1', '2', '3', '3'],
                   'tweet': ['a', 'a', 'b', 'b', 'c']})
df = df.groupby('tweet').agg(['count', 'nunique'])
df.columns = df.columns.droplevel()
df[(df['count'] > 1) & (df['nunique'] == 1)]

Vous pouvez aussi supprimer la colonne de comptage et uniquement le filtre basé sur nunique . Bravo!


0 commentaires

0
votes

Ce que vous pourriez faire, c'est: Rejoignez la table de comptage avec la table d'origine basée sur le tweet et triez-les en fonction de la colonne de tweet.

import numpy as np
tag_2['same_and_2'] = np.where(((tag_2['c'] == 2) & (tag_2['pk'] != tag_2['pk'].shift())), 1, 0)
tag_2.head()

 entrez la description de l'image ici

Ensuite, il suffit de trouver les tweets qui n'apparaissent que deux fois (colonne c ) et de les comparer à la colonne tag ou pk en utilisant numpy .

tb_counter.columns = ['tweet', 'c']
tag_2 = tag.merge(tb_counter, how='left', on='tweet')
tag_2 = tag_2.sort_values('tweet')
tag_2.head()

entrez la description de l'image ici


0 commentaires