【问题标题】:Keeping Data Frame Values Based on Summed Column根据求和列保留数据框值
【发布时间】:2020-06-18 17:57:57
【问题描述】:

这是我之前得到帮助的一个问题的后续问题。

这就是问题所在。假设有一个数据框-

dic = {'firstname':['John','John','John','John','John','Susan','Susan',
                    'Susan','Susan','Susan','Mike','Mike','Mike','Mike',
                    'Mike'],
       'lastname':['Smith','Smith','Smith','Smith','Smith','Wilson',
                   'Wilson','Wilson','Wilson','Wilson','Jones','Jones',
                   'Jones','Jones','Jones'],
       'company':['KFC','BK','KFC','KFC','KFC','BK','BK','WND','WND',
                  'WND','TB','CHP','TB','CHP','TB'],
       'paid':[200,300,250,100,900,650,430,218,946,789,305,750,140,860,310],
       'overtime':[205,554,840,100,203,640,978,451,356,779,650,950,230,250,980]}
df = pd.DataFrame(dic)
print(df)

带输出-

   firstname lastname company  paid  overtime
0       John    Smith     KFC   200       205
1       John    Smith      BK   300       554
2       John    Smith     KFC   250       840
3       John    Smith     KFC   100       100
4       John    Smith     KFC   900       203
5      Susan   Wilson      BK   650       640
6      Susan   Wilson      BK   430       978
7      Susan   Wilson     WND   218       451
8      Susan   Wilson     WND   946       356
9      Susan   Wilson     WND   789       779
10      Mike    Jones      TB   305       650
11      Mike    Jones     CHP   750       950
12      Mike    Jones      TB   140       230
13      Mike    Jones     CHP   860       250
14      Mike    Jones      TB   310       980

最初,我想对付费列求和,只显示超过 1300 的值。 这样就解决了-

df = df.groupby(['lastname', 'firstname','company'], as_index=False).agg({'paid':'sum'})
s = df['paid']>1300
df['limit']=s
df = df.loc[df['limit']==True]
del df['limit']
df = df.sort_values(by=['paid'],ascending=False).reset_index()
del df['index']
print(df)

带输出-

  lastname firstname company  paid
0   Wilson     Susan     WND  1953
1    Jones      Mike     CHP  1610
2    Smith      John     KFC  1450

我现在想做的事情比较相似,但我不想再对这些值求和,我只想保留基于“付费”列求和大于 1300 的行中的原始信息。

期望的输出-

   firstname lastname company  paid  overtime
0       John    Smith     KFC   200       205
1       John    Smith     KFC   250       840
2       John    Smith     KFC   100       100
3       John    Smith     KFC   900       203
4      Susan   Wilson     WND   218       451
5      Susan   Wilson     WND   946       356
6      Susan   Wilson     WND   789       779
7       Mike    Jones     CHP   750       950
8       Mike    Jones     CHP   860       250

【问题讨论】:

    标签: python pandas dataframe filter sum


    【解决方案1】:

    这是一个非常简单的单行更改。代替 agg,做变换:

    df = df.groupby(['lastname', 'firstname','company'], as_index=False).transform(sum)
    And then,
    df[df.groupby(['lastname', 'firstname','company'])['paid'].transform('sum') > 1350]
    

    编辑:感谢 Datanovice 指出我应该将其作为一个完整的答案并写下最后一行。

    【讨论】:

    • 如果您也添加切片,这将是一个完整的答案df[df.groupby(['lastname', 'firstname','company'])['paid'].transform('sum') > 1350]
    猜你喜欢
    • 2021-08-08
    • 2016-11-14
    • 1970-01-01
    • 2023-01-08
    • 2020-04-15
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    相关资源
    最近更新 更多