Pandas:在两个不同的列中获得两个具有相同值对的不同行

时间:2017-09-24 05:24:58

标签: python python-3.x pandas

我有两列_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和duplicated,但我似乎无法得到上面显示的结果。

2 个答案:

答案 0 :(得分:2)

sort_values

上使用temp
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

答案 1 :(得分: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