Как объединить четыре таблицы в Pandas? - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть четыре таблицы: predicted_tags, actual_tags, tags_names и news_text.

В таблицах predicted_tags и actual_tags имена строк являются тегами id. В этих таблицах 1 означает True, а 0 означает False.

Форма predicted_tags и actual_tags (23413, 1369).

predicted_tags

print(predicted_tags)
+-------+-----+---+-----+------+------+
|       |   1 | 3 | ... | 8345 | 8347 |
+-------+-----+---+-----+------+------+
| 35615 |   0 | 0 | ... |    1 |    0 |
| 58666 |   1 | 0 | ... |    0 |    0 |
| 16197 |   0 | 0 | ... |    0 |    1 |
| 68824 |   0 | 0 | ... |    1 |    1 |
| 22277 |   0 | 0 | ... |    1 |    0 |
+-------+-----+---+-----+------+------+

actual_tags

print(actual_tags)
+-------+-----+---+-----+------+------+
|       |   1 | 3 | ... | 8345 | 8347 |
+-------+-----+---+-----+------+------+
| 35615 |   0 | 0 | ... |    1 |    0 |
| 58666 |   1 | 1 | ... |    0 |    0 |
| 16197 |   0 | 0 | ... |    0 |    1 |
| 68824 |   0 | 0 | ... |    1 |    1 |
| 22277 |   0 | 1 | ... |    1 |    0 |
+-------+-----+---+-----+------+------+

tags_names

print(tags_names)
+--------+----------+-------------+
|        |   tag_id |  tag_name   |
+--------+----------+-------------+
| 127579 |        1 | politics    |
| 108814 |        3 | economics   |
|    ... |      ... | ...         |
|     18 |     8345 | hot         |
| 257141 |     8347 | environment |
+--------+----------+-------------+

news_text:

print(news_text)
+----------+------------------------+-----------------------------+
|          |       news_name        |         news_content        |
+----------+------------------------+-----------------------------+
|    35615 | Secret of…             |  Hi! Today I will talk...   |
|    58666 | Conversations with a … |  I have a big experience... |
|    16197 | Harm of alcohol        |  Today, we…                 |
|      ... | ...                    |  ...                        |
|    68824 | Hot news               |  Celebrity with...          |
|    22277 | Finance market         |  Last week…                 |
+----------+------------------------+-----------------------------+

Я хочу получить следующую таблицу:

+-------+------------------------+----------------------------+------------------------+---------------------------+
|       |       news_name        |        news_content        |     predicted_tags     |        actual_tags        |
+-------+------------------------+----------------------------+------------------------+---------------------------+
| 35615 | Secret of…             | Hi! Today I will talk...   | ['hot']                | ['hot']                   |
| 58666 | Conversations with a … | I have a big experience... | ['politics']           | ['politics', 'economics'] |
| 16197 | Harm of alcohol        | Today, we…                 | ['environment']        | ['environment']           |
| 68824 | Hot news               | Celebrity with...          | ['hot', 'environment'] | ['hot', 'environment']    |
| 22277 | Finance market         | Last week…                 | ['hot']                | ['hot', 'economics']      |
+-------+------------------------+----------------------------+------------------------+---------------------------+

Как я могу сделать это, используя Панд?

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Вы можете преобразовать одну горячую кодировку тегов в список тегов, используя pandas apply . Я бы изменил tag_names из dataframe в серию (индекс index_id и значение tag name). Сейчас я демонстрирую это только двумя тегами.

>>> import pandas as pd
>>> df = pd.DataFrame({
            1: [0, 1, 0, 0, 0],
            3: [0, 1, 0, 0, 1]}, 
        index=[35615, 58666, 16197, 68824, 22277] ) # predicted_tags
>>> df
       1  3
35615  0  0
58666  1  1
16197  0  0
68824  0  0
22277  0  1
>>> tag_names = pd.DataFrame({"tag_id": [1,3,], 
        "tag_name": ["politics", "economics"]},
         index=[127579, 108814])
>>> tag_names
        tag_id   tag_name
127579       1   politics
108814       3  economics
>>> tags = tag_names.set_index("tag_id").tag_name
>>> tags
tag_id
1     politics
3    economics
Name: tag_name, dtype: object
>>> df.apply( lambda row: [tags.loc[k] for k,v in row.items() if v > 0] , axis=1)
35615                       []
58666    [politics, economics]
16197                       []
68824                       []
22277              [economics]
dtype: object
>>> 

Теперь вы можете присоединиться к этому с news_text в индексе.

0 голосов
/ 04 сентября 2018

Преобразовать tags_names df в словарь и использовать его для переименования столбцов:

tag_names = dict(zip(tags_names['tag_id'], tags_names['tag_names']))

predicted_tags.rename(columns = tag_names, inplace = True)
actual_tags.rename(columns = tag_names, inplace = True)

Получить имена столбцов, где значение равно 1.

news_text['actual_tags'] = (actual_tags == 1 ).apply(lambda y: actual_tags.columns[y.tolist()].tolist(), axis=1)
news_text['predicted_tags'] = (predicted_tags == 1 ).apply(lambda y: predicted_tags.columns[y.tolist()].tolist(), axis=1)
0 голосов
/ 04 сентября 2018

Прежде всего, создайте столбец, который содержит все фактические / прогнозируемые значения, такие как:

predicted_tags['pred_loc'] = predicted_tags.values.tolist()
actual_tags['actual_loc'] = actual_tags.values.tolist()

Кроме того, если ваш tag_id (в tag_names dataFrame) находится в том же порядке, что и столбцы в фактических и прогнозируемых тегах dataFrame. Затем просто создайте список имен тегов, таких как

tags = tag_names.tag_name.values.tolist()

Теперь, прежде чем мы преобразуем, мы объединяем это с news_text dataFrame,

news_text = news_text.merge(predicted_tags['pred_loc'], how='outer', left_index=True, right_index=True)
news_text = news_text.merge(actual_tags['actual_loc'], how='outer', left_index=True, right_index=True)

Теперь мы конвертируем:

news_text.pred_loc = news_text.pred_loc.apply(lambda x: [tags[i] for i, j in enumerate(x) if j == 1])
news_text.actual_loc = news_text.actual_loc.apply(lambda x: [tags[i] for i, j in enumerate(x) if j == 1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...