根据列的值从数据框中删除行

时间:2019-03-06 10:31:10

标签: python dataframe

我有9153行和3列的数据框(标记)。 这是前5行。

with open('air_stations_Nov2017.csv', mode='r', encoding='utf=8') as file:
    csv_file = csv.DictReader(file, delimiter=",")
    json_data = []
    for item in csv_file:
        json_data.append({'Station':item['Station'],'District Name':item['District Name']})
    print(json.dumps(json_data))

我想做的是看一条推文是否有两个标签,并且这些标签彼此不同,就像这些标签一样,

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

然后我从数据帧中消除这些推文。但是如果tweet获得了两个类似的标签,则接受tweet,并且不会被删除。 为了解决这个问题,我创建了一个新的数据框架,其中包含推文编号。及其标签数量

          pk    tag     tweet
5287    5436    unknown 16600
8477    8626    real    16600

在这里x数据帧的前5行,一些推文获得3个甚至更多(最多15个)标签,但我只关心推文获得两个标签

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

然后创建带有推文编号的列表。只有两个标签

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

但是我坚持如何比较tweet是否具有相似或不同的标签,如何删除,如果它们具有不同的标签,并接受,如果它们具有相似的标签。

3 个答案:

答案 0 :(得分:0)

尝试获取每个推文的唯一计数,然后消除计数是否大于一个

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

希望这可以解决您的问题

答案 1 :(得分:0)

假设相似=相同,您可以在下面找到一个示例:

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进行过滤。 干杯!

答案 2 :(得分:0)

您可以做的是: 将计数器表与基于推文的原始表连接起来,并根据推文列对它们进行排序。

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将其与主要的pknumpy列进行比较。

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