1
AFER接合兩個數據幀:Python的熊貓數據幀:組行和減少基團與自定義函數
left_dict = {
'id1': [1,2,3,4,5],
'val1': [10,20,30,40,50],
'lft': ['a','b','c','d','e']
}
right_dict = {
'id1': [1,7,3,4,8,1,3],
'val2': [100,700,300,400,800,110,330],
'rgt': [1.1,2.2,3.3,4.4,5.5,6.6,7.7]
}
left = pd.DataFrame(left_dict)
right = pd.DataFrame(right_dict)
r = pd.merge(left, right, how='outer', on='id1', indicator=False)
我得到產生的數據幀:
id1 lft val1 rgt val2
0 1.0 a 10.0 1.1 100.0
1 1.0 a 10.0 6.6 110.0
2 2.0 b 20.0 NaN NaN
3 3.0 c 30.0 3.3 300.0
4 3.0 c 30.0 7.7 330.0
5 4.0 d 40.0 4.4 400.0
6 5.0 e 50.0 NaN NaN
7 7.0 NaN NaN 2.2 700.0
8 8.0 NaN NaN 5.5 800.0
現在我需要摺疊具有相同的行'id1','lft'和'rgt'與'id1','lft','rgt'保持一行,並且在這個數據框中添加一個新的列'xxx'。在此列「XXX」值計算與函數
def f(val1, val2):
if math.isnan(val2):
r = val1
else:
if math.isnan(val1):
r = val2
else:
r = val1 * 2 + val2 * 3
return r
所以得出的數據幀應該是這樣的:
id1 lft val1 rgt val2 xxx
0 1.0 a 10.0 1.1 100.0 320.0
1 2.0 b 20.0 NaN NaN 20.0
2 3.0 c 30.0 3.3 300.0 960.0
3 4.0 d 40.0 4.4 400.0 40.0
4 5.0 e 50.0 NaN NaN 50.0
5 7.0 NaN NaN 2.2 700.0 700.0
6 8.0 NaN NaN 5.5 800.0 800.0
我試圖用:
In [85]: r.groupby(['id1','val1', 'lft', 'rgt']).groups
這將返回一個字典的值等於組中的行號,這根本沒有任何幫助。任何想法如何實際摺疊和減少行?
當「摺疊」行時,如果'id1'對於多行是相同的,那麼如何在最終數據框中選擇'rgt'和'val1'的值? – Peaceful
你是對的,我錯過了這部分。現在我已經用「 」糾正了我的問題現在我需要用'id1','lft','rgt'將相同的'id1','lft'和'rgt'摺疊成一行,並且添加一個新的列'xxx'到這個數據幀。這個'xxx'列中的值是通過函數「 – zork
」來計算的。「摺疊行」是什麼意思? – josh