我正在尝试加入两个不同的数据帧。我会解释到目前为止我做了什么,所以你会明白我的尝试。我是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] 没有得到更新。但我觉得我是以一种非常复杂的方式做这件事的。
有任何想法如何以更优雅的方式做到这一点?
答案 0 :(得分:3)
您可以使用set_index
,unstack
和reset_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