Python 如何将groupby().transform()转换为特定的行值,而不是像min()这样的函数结果?
我有一个熊猫数据帧Python 如何将groupby().transform()转换为特定的行值,而不是像min()这样的函数结果?,python,pandas,slice,pandas-groupby,Python,Pandas,Slice,Pandas Groupby,我有一个熊猫数据帧df1,看起来像这样: 输入: Shop Item Card Price Butcher A AMEX 1.5 Butcher A VISA 0.9 Baker B AMEX 2.5 Baker B VISA 3.5 Candlestick maker C AMEX 1.5 Candles
df1
,看起来像这样:
输入:
Shop Item Card Price
Butcher A AMEX 1.5
Butcher A VISA 0.9
Baker B AMEX 2.5
Baker B VISA 3.5
Candlestick maker C AMEX 1.5
Candlestick maker C VISA 1.5
Shop Item Card Price Price with VISA
Butcher A AMEX 1.5 0.9
Butcher A VISA 0.9 0.9
Baker B AMEX 2.5 3.5
Baker B VISA 3.5 3.5
Candlestick maker C AMEX 1.5 1.5
Candlestick maker C VISA 1.5 1.5
我知道df1.groupby([“Shop”])['Price'].transform(min)
会给我一列df1.Price的min()
但是,我想转换为VISA支付所达到的价格,以便将折扣与卡中的所有其他值进行比较。如您所见,这并不总是min()
,也不总是max()
所需输出:
Shop Item Card Price
Butcher A AMEX 1.5
Butcher A VISA 0.9
Baker B AMEX 2.5
Baker B VISA 3.5
Candlestick maker C AMEX 1.5
Candlestick maker C VISA 1.5
Shop Item Card Price Price with VISA
Butcher A AMEX 1.5 0.9
Butcher A VISA 0.9 0.9
Baker B AMEX 2.5 3.5
Baker B VISA 3.5 3.5
Candlestick maker C AMEX 1.5 1.5
Candlestick maker C VISA 1.5 1.5
我目前的解决方案是基于
for
循环的,并且公认是丑陋而漫长的:
for shop in df1.Shop.unique().tolist():
df_target = df1[df1.Shop == shop]
...
必须有一种更有效的方法(即单班轮)
如何将groupby().transform()转换为特定的行值,而不是像min()这样的函数结果?
编辑:请注意,并非所有Shop
项目都提供VISA
付款我认为需要通过过滤数据框
-仅VISA
行:
df1['Price'] = df1['Shop'].map(df1.loc[df1['Card'] == 'VISA'].set_index('Shop')['Price'])
print (df1)
Shop Item Card Price
0 Butcher A AMEX 0.9
1 Butcher A VISA 0.9
2 Baker B AMEX 3.5
3 Baker B VISA 3.5
4 Candlestick maker C AMEX 1.5
5 Candlestick maker C VISA 1.5
详情:
print (df1.loc[df1['Card'] == 'VISA'].set_index('Shop')['Price'])
Shop
Butcher 0.9
Baker 3.5
Candlestick maker 1.5
Name: Price, dtype: float64
如果获得:
InvalidIndexError:重新索引仅对唯一值的索引对象有效
这意味着每组有更多的VISA
行
溶液为聚合min
:
print (df1)
Shop Item Card Price
0 Butcher A AMEX 1.5
1 Butcher A VISA 0.9 <-duplicated row
2 Butcher A VISA 1.9 <-duplicated row
3 Baker B AMEX 2.5
4 Baker B VISA 3.5
5 Candlestick maker C AMEX 1.5
6 Candlestick maker C VISA 1.5
df1['Price'] = df1['Shop'].map(df1.loc[df1['Card'] == 'VISA'].groupby('Shop')['Price'].min())
print (df1)
Shop Item Card Price
0 Butcher A AMEX 0.9
1 Butcher A VISA 0.9
2 Butcher A VISA 0.9
3 Baker B AMEX 3.5
4 Baker B VISA 3.5
5 Candlestick maker C AMEX 1.5
6 Candlestick maker C VISA 1.5
打印(df1)
商店商品卡价格
0 Butcher A美国运通1.5
1屠夫签证0.9是有意义的-在这一刻,我只是得到了一个专栏与南从这个-让我check@sudonym-如果在map
之后获得NaN
s,则表示在某些类别中不是VISA
行。@sudonym-不确定是否理解,在map
getNaN
s之后查找缺少的类别。所以需要将所有行更改为NaN
s吗?例如,如果最后一行烛台制造商C VISA 1.5 1.5
不存在,输出中需要什么?@sudonym-这很奇怪,打印(df1.loc[df1['Card']=='VISA'].set_index('Shop')['Price'])
返回一些东西?@sudonym如果不存在,可能是卡片
列中的一些空格,如'VISA'
?