簡體   English   中英

熊貓:串聯以唯一值為條件

[英]Pandas: concatenating conditioned on unique values

我正在串聯兩個熊貓數據幀,如下所示。

part1 = pd.DataFrame({'id'    :[100,200,300,400,500], 
                   'amount': np.random.randn(5)
                    })

part2 = pd.DataFrame({'id'    :[700,100,800,500,300], 
                   'amount': np.random.randn(5)
                    })

concatenated = pd.concat([part1, part2], axis=0)
     amount   id
0 -0.458653  100
1  2.172348  200
2  0.072494  300
3 -0.253939  400
4 -0.061866  500
0 -1.187505  700
1 -0.810784  100
2  0.321881  800
3 -1.935284  500
4 -1.351507  300

如果行id未在part1出現,如何限制該操作,以便part2中的行僅包含在concatenated中? 在某種程度上,我想將id列視為一組。

是否可以在concat()期間執行此操作,還是更多的后處理步驟?

此示例的所需輸出為:

concatenated_desired
     amount   id
0 -0.458653  100
1  2.172348  200
2  0.072494  300
3 -0.253939  400
4 -0.061866  500
0 -1.187505  700
2  0.321881  800

concat()之后調用drop_duplicates() concat()

part1 = pd.DataFrame({'id'    :[100,200,300,400,500], 
                   'amount': np.arange(5)
                    })

part2 = pd.DataFrame({'id'    :[700,100,800,500,300], 
                   'amount': np.random.randn(5)
                    })

concatenated = pd.concat([part1, part2], axis=0)
print concatenated.drop_duplicates(cols="id")

如果您獲得帶有id的列,則將其用作索引。 使用真實索引執行操作將使事情變得容易。 在這里,您可以使用combine_first完成您要搜索的內容:

part1 = part1.set_index('id')

part2 = part2.set_index('id')

part1.combine_first(p2)
Out[38]: 
       amount
id           
100  1.685685
200 -1.895151
300 -0.804097
400  0.119948
500 -0.434062
700  0.215255
800 -0.031562

如果您確實不需要獲取該索引,請在執行以下操作后將其重置:

part1.combine_first(p2).reset_index()
Out[39]: 
    id    amount
0  100  1.685685
1  200 -1.895151
2  300 -0.804097
3  400  0.119948
4  500 -0.434062
5  700  0.215255
6  800 -0.031562

計算ID不在part1中

In [28]:
diff = part2.ix[~part2['id'].isin(part1['id'])]
diff

Out[28]:
     amount   id
0 -2.184038  700
2 -0.070749  800

現在開始

In [29]:
concatenated = pd.concat([part1, diff], axis=0)
concatenated

Out[29]:
     amount   id
0 -2.240625  100
1 -0.348184  200
2  0.281050  300
3  0.082460  400
4 -0.045416  500
0 -2.184038  700
2 -0.070749  800

您也可以將其放在一個襯紙中:

concatenated = pd.concat([part1, part2.ix[~part2['id'].isin(part1['id'])]], axis=0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM