Python 熊猫:使用其他列的子组中的值创建新列

Python 熊猫:使用其他列的子组中的值创建新列,python,pandas,Python,Pandas,我有一个带有事务的数据框。索引是交易的日期(时间戳),列是价格(浮动)、城市(字符串)和产品名称(字符串)。我想在数据框中添加一个新列,其中包含每个城市每种产品的最低价格。因此,第四列对于城市和产品相同的每一行都具有相同的值 下面是示例代码: # dictionary of transactions d = {'1': ['20', 'NYC', 'Widget A'], '2': ['30', 'NYC', 'Widget A'], '3': ['5', 'NYC', 'Widget A']

我有一个带有事务的数据框。索引是交易的日期(时间戳),列是价格(浮动)、城市(字符串)和产品名称(字符串)。我想在数据框中添加一个新列,其中包含每个城市每种产品的最低价格。因此,第四列对于城市和产品相同的每一行都具有相同的值

下面是示例代码:

# dictionary of transactions

d = {'1': ['20', 'NYC', 'Widget A'], '2': ['30', 'NYC', 'Widget A'], '3': ['5', 'NYC', 'Widget A'], \
     '4': ['300', 'LA', 'Widget B'], '5': ['30', 'LA', 'Widget B'],  '6': ['100', 'LA', 'Widget A']}

columns=['Price', 'City', 'Product']

# create dataframe and rename columns

df = pd.DataFrame.from_dict(data=d, orient='index')
df.columns = columns
这将生成如下所示的数据帧

Price   City    Product

1   20  NYC Widget A

2   30  NYC Widget A

3   5   NYC Widget A

4   300 LA  Widget B

5   30  LA  Widget B

6   100 LA  Widget A

因此,我想添加一个新的列,其中包含每个城市/产品子组的最低价格。因此,第1-3行(所有的NYC/小部件A)将是5(第3行中的最小价格),第4行和第5行的值将是30(LA/小部件B),第6行的值将是100。

您需要将
转换
应用到
groupby
,这将保留原始数据帧的形状

import pandas as pd
import numpy as np

df = pd.DataFrame({'price': np.round(np.random.random(15), 2), 
                   'product': list('ABC') * 5, 
                   'city': ['San Francisco'] * 10 + ['New York'] * 5}

df['min_city_product_price'] = df.groupby(['city', 'product']).price.transform(min)

>>> df
             city  price product  min_city_product_price
0   San Francisco   0.65       A                    0.35
1   San Francisco   0.97       B                    0.28
2   San Francisco   0.09       C                    0.09
3   San Francisco   0.35       A                    0.35
4   San Francisco   0.28       B                    0.28
5   San Francisco   0.84       C                    0.09
6   San Francisco   0.49       A                    0.35
7   San Francisco   0.94       B                    0.28
8   San Francisco   0.13       C                    0.09
9   San Francisco   0.89       A                    0.35
10       New York   0.75       B                    0.30
11       New York   0.31       C                    0.31
12       New York   0.22       A                    0.22
13       New York   0.30       B                    0.30
14       New York   0.56       C                    0.31

从示例数据框
product.csv
开始,如下所示:

date,price,city,product
2015-09-21,1.5,c1,p1
2015-09-21,1.2,c1,p1
2015-09-21,0.5,c1,p2
2015-09-21,0.3,c1,p2
2015-09-22,0.6,c2,p2
2015-09-22,1.2,c2,p2
我会这样做:

# Read Dataframe
df = pd.read_csv('product.csv')
然后,我将添加所需的列,其中包含:

df['minprice'] = df.groupby(['city','product'])['price'].transform(min)
返回:

         date  price city product  minprice
0  2015-09-21    1.5   c1      p1       1.2
1  2015-09-21    1.2   c1      p1       1.2
2  2015-09-21    0.5   c1      p2       0.3
3  2015-09-21    0.3   c1      p2       0.3
4  2015-09-22    0.6   c2      p2       0.6
5  2015-09-22    1.2   c2      p2       0.6

希望能有所帮助。

请添加一些示例代码和预期输出,以便重现您的问题。为了响应该请求,添加输入和输出的示例数据框被认为是礼貌的。否则人们就得花时间去编自己的例子,有时这意味着人们提出的例子与你的真实案例不同,在某种程度上你没有想到要提及,这让每个人都很沮丧。谢谢大家。这是我的第一篇帖子,所以我没有意识到这一点。我刚刚编辑了这篇文章以包含样本数据。谢谢!这确实有帮助。这实际上是我在发布这个问题之前尝试过的一个解决方案。它对示例数据有效,但当我尝试在实际数据集上使用它时,我得到一个错误“ValueError:Length mismatch:Expected axis有5221个元素,新值有5247个元素”。我自己的数据集肯定有问题。问题是在我的数据集中,一些价格是NaN。这导致了长度不匹配。问题解决了。再次感谢,不客气。请考虑接受两个答案中的一个,如果它们能帮助你解决你的任务。我想知道如果我想向传递给
transform
的函数传递一个附加参数,该怎么办?e、 类似于
transform(func,args=1)
(当然这不起作用)。非常感谢,谢谢!另一个用户提供了相同的解决方案,因此我将用我回复他的内容进行回复。此解决方案对示例数据进行了修改,但当我尝试在实际数据集上使用它时,得到一个错误“ValueError:长度不匹配:预期轴有5221个元素,新值有5247个元素”。我自己的数据集肯定有问题。问题是在我的数据集中,一些价格是NaN。这导致了长度不匹配。问题解决了。再次感谢。