Удалить строки из фрейма данных на основе значения столбцов - PullRequest
1 голос
/ 06 марта 2019

У меня есть датафрейм (тег) с 9153 строками и 3 столбцами. Здесь первые 5 строк.

    pk  tag     tweet
0   148 unknown 9491
1   149 ignore  9513
2   150 real    8461
3   151 fake    8639
4   152 unknown 8385

То, что я пытаюсь сделать, это посмотреть, получает ли твит два тега, и эти теги отличаются друг от друга, как и эти,

          pk    tag     tweet
5287    5436    unknown 16600
8477    8626    real    16600

тогда я исключаю эти твиты из фрейма данных. но если твит получит два тега сравнения, тогда примите твит, и он не будет удален. Чтобы решить эту проблему, я создал новый фрейм данных, состоящий из твита №. и его количество тегов

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

здесь первые 5 строк x фрейма данных, некоторые твиты получают 3 или даже больше (до 15) тегов, но меня интересует только твиты, получившие два тега

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

Затем создайте список, в котором нет твита. который имеет только два тега

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

но я застрял на том, как сравнивать, если твиты имеют похожие или разные теги, и удалял, если они имеют разные теги, и принимал, если они имеют похожие теги.

Ответы [ 3 ]

0 голосов
/ 06 марта 2019

Предполагая, что подобное = то же самое, вы можете найти пример ниже:

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)]

Также можно удалить столбец подсчета и фильтровать только по nunique. Ура! * * 1005

0 голосов
/ 06 марта 2019

Что вы можете сделать, это: Соедините таблицу счетчиков с исходной таблицей на основе твита и сортируйте их по столбцу твитов.

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()

enter image description here

Далее нужно просто найти твиты, которые появляются только дважды (столбец c), и сравнить их с столбцом tag или pk, используя numpy.

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()

enter image description here

0 голосов
/ 06 марта 2019

Попробуйте получить уникальный счетчик для каждого твита, а затем исключить, если счет больше одного

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]
=====================================

Надеюсь, что это решит вашу проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...