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
get
NaN
s之后查找缺少的类别。所以需要将所有行更改为
NaN
s吗?例如,如果最后一行
烛台制造商C VISA 1.5 1.5
不存在,输出中需要什么?@sudonym-这很奇怪,
打印(df1.loc[df1['Card']=='VISA'].set_index('Shop')['Price'])
返回一些东西?@sudonym如果不存在,可能是
卡片
列中的一些空格,如
'VISA'