2017-09-24 68 views
0

我有两列_Id和_ParentId与此示例数据。使用这个我想用_ParentId将_Id分组。熊猫:在两个不同的列中获取具有相同值对的两个不同行

 _Id _ParentId 
     1  NaN 
     2  NaN 
     3  1.0 
     4  2.0 
     5  NaN 
     6  2.0 

分组结果应显示如下。

 _Id _ParentId 
     1  NaN 
     3  1.0 
     2  NaN 
     4  2.0 
     6  2.0 
     5  NaN 

这样做的主要目的是,其_id属于哪个_ParentId(例如_id 3属于_id 1)基团。

我试图使用groupby和重复,但我似乎无法得到上面显示的结果。

回答

2

使用sort_valuestemp

In [3188]: (df.assign(temp=df._ParentId.combine_first(df._Id)) 
       .sort_values(by='temp').drop('temp', 1)) 
Out[3188]: 
    _Id _ParentId 
0 1  NaN 
2 3  1.0 
1 2  NaN 
3 4  2.0 
5 6  2.0 
4 5  NaN 

详细

In [3189]: df._ParentId.combine_first(df._Id) 
Out[3189]: 
0 1.0 
1 2.0 
2 1.0 
3 2.0 
4 5.0 
5 2.0 
Name: _ParentId, dtype: float64 

In [3190]: df.assign(temp=df._ParentId.combine_first(df._Id)) 
Out[3190]: 
    _Id _ParentId temp 
0 1  NaN 1.0 
1 2  NaN 2.0 
2 3  1.0 1.0 
3 4  2.0 2.0 
4 5  NaN 5.0 
5 6  2.0 2.0 
+0

我想你是正确的!你为自己赢得了一个心灵读者徽章。 – piRSquared

+0

这完美的作品。在将值排序之前,我从未想过将它们合并为预处理。谢谢! – WhiteSolstice

1

你的预期输出是完全一样的输入,只是ID 4和6在一起,NaN的是,在不同的地方。它不可能有预期的产量。

这里是如何组通过将理想工作:

print("Original: ") 
print(df) 

df = df.fillna(-1) # if not replaced with another character , the grouping won't show NaNs. 
df2 = df.groupby('_Parent') 

print("\nAfter grouping: ") 
for key, item in df2: 
    print (df2.get_group(key)) 

输出:

Original: 
    _Id _Parent 
0 1  NaN 
1 2  NaN 
2 3  1.0 
3 4  2.0 
4 5  NaN 
5 6  2.0 

After grouping: 
    _Id _Parent 
0 1  0.0 
1 2  0.0 
4 5  0.0 
    _Id _Parent 
2 3  1.0 
    _Id _Parent 
3 4  2.0 
5 6  2.0 
相关问题