熊猫groupby并更新为最小值

时间:2018-07-17 07:31:09

标签: 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

预期:

   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"))

2 个答案:

答案 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

如果列的顺序很重要,请使用insertdfd['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']