2015-09-21 62 views
2

我有一個包含事務的數據框。索引是交易的日期(時間戳),列是價格(浮動),城市(字符串)和產品名稱(字符串)。我想向包含每個城市中每個產品的最低價格的數據框添加一個新列。因此,對於城市和產品相同的每一行,第四列將具有相同的值。熊貓:使用其他列的子組中的值創建新列

這裏的示例代碼:

# 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/Widget A)將是5(第3行中的最低價格),第4和5行將具有30(均爲LA/Widget B),並且第6行將具有值爲100.

+2

請添加一些示例代碼和預期輸出,以便重現您的問題。 –

+0

對於第二個請求,添加輸入和輸出的示例數據框被認爲是禮貌的。否則,人們不得不花時間編寫自己的例子,有時這意味着人們提出的例子與您的真實案例有所不同,但某些方面您不會提及,這會讓所有人感到失望。 – DSM

+0

謝謝你們。這是我的第一篇文章,所以我沒有意識到這一點。我剛剛編輯帖子以包含示例數據。 – MRA

回答

4

從樣本數據幀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) 

其中r eturns:

  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 

希望有所幫助。

+0

謝謝!這確實有幫助。這實際上是我在發佈這個問題之前嘗試的解決方案。它處理了示例數據,但是當我嘗試在我的實際數據集上使用它時,出現錯誤「ValueError:長度不匹配:預期軸有5221個元素,新值有5247個元素」。必須是我自己的數據集的一些問題。 – MRA

+0

問題是在我的數據集中,一些價格是NaN。這是造成長度不匹配。問題解決了。再次感謝。 – MRA

+0

不客氣。如果他們幫助你解決你的任務,請考慮接受其中的一個答案。 –

3

您需要將transform應用於groupby,它保留了原始DataFrame的形狀。

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 
+0

謝謝!另一位用戶提供了相同的解決方案,所以我會回覆我回復他的內容。這個解決方案包含了示例數據,但是當我嘗試在我的實際數據集上使用它時,出現錯誤「ValueError:長度不匹配:預期軸有5221個元素,新值有5247個元素」。必須是我自己的數據集的一些問題。 – MRA

+0

問題是,在我的數據集中,一些價格是NaN。這是造成長度不匹配。問題解決了。再次感謝。 – MRA

相關問題