min*_*bro 3 python pandas pandas-groupby
我的数据框:
dfd = pd.DataFrame({'A': ['Apple','Apple', 'Apple','Orange','Orange','Orange','Pears','Pears'],
'B': [1,2,9,6,4,3,2,1]
})
A B
0 Apple 1
1 Apple 2
2 Apple 9
3 Orange 6
4 Orange 4
5 Orange 3
6 Pears 2
7 Pears 1
Run Code Online (Sandbox Code Playgroud)
预期的:
A new_B old_B
0 Apple 1 1
1 Apple 1 2
2 Apple 1 9
3 Orange 3 6
4 Orange 3 4
5 Orange 3 3
6 Pears 1 2
7 Pears 1 1
Run Code Online (Sandbox Code Playgroud)
预期数据框:new_values 包含该组的最小值,对于 Apple,B 列的最小值为 1,因此 Apple 的所有新值都是 1,类似地,B 列的 Orange 最小值为 3,在 new_b 列中被替换。
第二个预期输出: 一旦实现上述预期输出,我必须为每个组创建 sql 语句并写入文件:基本上,迭代每一行并编写 sql 查询:
sql_query= "update test_tbl "\
"set id = {0}"\
"where id = {1}"\
"and A = '{2}' ".format(new_b,old_b,A)
print(sql_query, file=open("output.sql", "a"))
Run Code Online (Sandbox Code Playgroud)
使用GroupBy.transform了Series具有相同尺寸的原df:
dfd['new_B'] = dfd.groupby('A')['B'].transform('min')
print (dfd)
A B new_B
0 Apple 1 1
1 Apple 2 1
2 Apple 9 1
3 Orange 6 3
4 Orange 4 3
5 Orange 3 3
6 Pears 2 1
7 Pears 1 1
Run Code Online (Sandbox Code Playgroud)
如果列的顺序很重要,请使用insert和rename:
dfd.insert(1, 'new_B', dfd.groupby('A')['B'].transform('min'))
dfd = dfd.rename(columns={'B':'old_B'})
print (dfd)
A new_B old_B
0 Apple 1 1
1 Apple 1 2
2 Apple 1 9
3 Orange 3 6
4 Orange 3 4
5 Orange 3 3
6 Pears 1 2
7 Pears 1 1
Run Code Online (Sandbox Code Playgroud)
如果transform不可能使用这里是替代解决方案:
#aggregate by min
s = dfd.groupby('A')['B'].min()
print (s)
A
Apple 1
Orange 3
Pears 1
Name: B, dtype: int64
#insert and map
dfd.insert(1, 'new_B', dfd['A'].map(s))
dfd = dfd.rename(columns={'B':'old_B'})
print (dfd)
A new_B old_B
0 Apple 1 1
1 Apple 1 2
2 Apple 1 9
3 Orange 3 6
4 Orange 3 4
5 Orange 3 3
6 Pears 1 2
7 Pears 1 1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3553 次 |
| 最近记录: |