我的数据框:
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
预期:
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
预期数据帧:new_values包含该组的最小值,对于Apple,B列的最小值为1,因此Apple的所有新值均为1,对于Orange,B列的最小值为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"))
答案 0 :(得分:1)
将GroupBy.transform
用于<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
<td class="container">
<span>date info</span>
<a href="#" class="tickets">one</a>
</td>
<td class="container">
<span>date info</span>
</td>
</table>
,其大小与原始Series
相同:
df
如果列的顺序很重要,请使用insert
和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
:
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
,请使用以下替代解决方案:
transform
答案 1 :(得分:1)
我认为下面的脚本可以解决这个问题
import pandas as pd
dfd = pd.DataFrame({'A': ['Apple','Apple', 'Apple','Orange','Orange','Orange','Pears','Pears'],
'B': [1,2,9,6,4,3,2,1]
})
dfd_1 = dfd.groupby(['A'], as_index=False).agg({'B': 'min'})
dfd = pd.merge(dfd_1, dfd, how='left', left_on=['A'], right_on=['A'])
dfd.columns = ['A', 'new_B','old_B']