Python连接两个不同大小的数据帧

时间:2018-04-10 17:10:42

标签: python pandas dataframe join

我正在尝试加入两个不同的数据帧。我会解释到目前为止我做了什么,所以你会明白我的尝试。我是python的新手,我非常感谢每一个我可以改进代码的提示。

我有一个类似于此的数据集:

cluster, Type
      1,    M
      1,    T
      1,    M

我对数据进行了分组并进行了一些聚合。除此之外,我还在数据集中添加了一些列。所以我的数据框现在看起来像这样:

>>> df
cluster, Type, M, T
      1,    M, 0, 0
      1,    T, 0, 0
      1,    M, 0, 0

聚合看起来像这样:

>>> a
cluster  Type, len
      1,    M,   2
      1,    T,   1

我想将 len 从a放到df中的相应列,结果将是:

>>> df
cluster, Type, M, T
      1,    M, 2, 0
      1,    T, 0, 1

我试图做的是:

for idx, row in df.iterrows():
    c = row['cluster']
    t = row['Type']
    val = a.loc[
        (a['cluster'] == c) &
        (a['Type'] == t),
        'len'
    ]
    row[t] = val

最后,它失败了,因为最后一行 row [t] 没有得到更新。但我觉得我是以一种非常复杂的方式做这件事的。

有任何想法如何以更优雅的方式做到这一点?

2 个答案:

答案 0 :(得分:3)

您可以使用set_indexunstackreset_index将其从'a'转换为预期结果:

df = a.set_index([a.Type,'cluster','Type'])['len']\
      .unstack(0).rename_axis(None,axis=1)\
      .reset_index()

输出:

   cluster Type    M    T
0        1    M  2.0  NaN
1        1    T  NaN  1.0

答案 1 :(得分:1)

这是一种方法。它仍然涉及一个循环,但我认为它比你想要做的更清晰,更快。它只使用您原来的df,不需要您提供的汇总。

首先制作一张每Type的长度字典:

len_dict = df.groupby('Type').size().to_dict()
>>> len_dict
{'M': 2, 'T': 1}

然后删除原始df中的重复项,最后循环遍历len_dict中的键并将approriate列分配给相应的键:

df.drop_duplicates(inplace=True)

for t in len_dict:
    df.loc[df.Type.eq(t), t] = len_dict[t]

>>> df
   cluster Type  M  T
0        1    M  2  0
1        1    T  0  1