Как объединить данные кадры? - PullRequest
0 голосов
/ 02 апреля 2019

У меня 2 кадра данных train и user_features. 'user_features' имеет node_id (соответствующий node1_id и node2_id в файлах train / test), представляющий пользователя, для которого у нас есть функции от f1 до f13. Я хочу преобразовать «поезд» так, чтобы он содержал функции от f1 до f13 как node1_id, так и node2_id соответственно.

train.head()
    node1_id  node2_id  is_chat
0   8446602   6636127        0
1   1430102   7433949        0
2   2803017   8372333        0
3   4529348    894645        0
4   5096572   4211638        0

user_features.head()
    node_id  f1  f2  f3  f4  f5  f6  f7  f8  f9  f10  f11  f12  f13
0      2     14  14  14  12  12  12   7   7   7    0    0    0   15
1      3     31   9   7  31  16  12  31  15  12   31   15   12    8
2      4      0   0   0   0   0   0   0   0   0    0    0    0    7
3      5     31   4   1  31   7   1  31   9   1   31    9    0   15
4      6     31  27  20  31  24  14  31  20  10   31   20    5    7

Ожидаемый преобразованный «поезд» должен быть:

train.head(1)
    node1_id  node2_id  is_chat f1 f2 ...f13 f14 f15 ...f26
0   8446602   6636127        0  14 14 ... 31  4   1   ...10

Там, где функции f1 to f13 имеют node1_id : 8446602 и f14 to f26 имеют node2_id : 6636127 соответственно. Спасибо.

import pandas as pd
import sys
if sys.version_info[0] < 3: 
    from StringIO import StringIO
else:
    from io import StringIO

train_data = StringIO("""node1_id node2_id is_chat
8446602 6636127 0
1430102 7433949 0
2803017 8372333 0
4529348 894645 0
5096572 4211638 0""")

features_data = StringIO("""node_id f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13
2 14 14 14 12 12 12 7 7 7 0 0 0 15
3 31 9 7 31 16 12 31 15 12 31 15 12 8
4 0 0 0 0 0 0 0 0 0 0 0 0 7
5 31 4 1 31 7 1 31 9 1 31 9 0 15
6 31 27 20 31 24 14 31 20 10 31 20 5 7""")

train_df = pd.read_csv(train_data, sep=" ")
features_df = pd.read_csv(features_data, sep=" ")

1 Ответ

0 голосов
/ 02 апреля 2019

.merge() с использованием именованных параметров left_on и right_on для указания желаемых столбцов слияния.

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

import pandas as pd
import sys
if sys.version_info[0] < 3: 
    from StringIO import StringIO
else:
    from io import StringIO

train_data = StringIO("""node1_id node2_id is_chat
8446602 6636127 0
1430102 7433949 0
2803017 8372333 0
4529348 894645 0
5096572 4211638 0""")

features_data = StringIO("""node_id f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12 f13
6636127 14 14 14 12 12 12 7 7 7 0 0 0 15
8446602 31 9 7 31 16 12 31 15 12 31 15 12 8
4 0 0 0 0 0 0 0 0 0 0 0 0 7
5 31 4 1 31 7 1 31 9 1 31 9 0 15
6 31 27 20 31 24 14 31 20 10 31 20 5 7""")

train_df = pd.read_csv(train_data, sep=" ")
features_df = pd.read_csv(features_data, sep=" ")

print(train_df.merge(features_df, left_on="node1_id", right_on="node_id").merge(features_df, left_on="node2_id", right_on="node_id"))

...