如何合并给定的数据帧?

时间:2019-04-02 13:09:56

标签: python-3.x pandas dataframe data-analysis

我有2个数据框train和user_features。 “ user_features”具有node_id(对应于训练/测试文件中的node1_id和node2_id),代表具有f1至f13功能的用户。我想对“火车”进行转换,使其包含node1_id和node2_id分别从f1到f13的特征。

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 : 8446602f14 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 :(得分:0)

.merge()使用left_onright_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"))