2015-10-22 11 views
5

मेरे पास एक सीएसवी है जिसमें 3 कॉलम, count_id, AMV और समय शामिल है।पांडा डेटा फ्रेम - लैम्ब्डा कैलकुलेशन और न्यूनतम मूल्य प्रति श्रृंखला

मैं पांडा का उपयोग कर रहा हूं और इसे डेटा फ्रेम के रूप में पढ़ा है।

results= pd.read_csv('./output.csv') 

सबसे पहले, मैं पहले डेटा फ्रेम को count_id के लिए सॉर्ट कर रहा हूं और फिर एएमवी के लिए।

results_sorted = results.sort_index(by=['count_id','AMV'], ascending=[True, True]) 

इससे

count_id AMV Hour 
0 16012E 4004 14 
1 16012E 4026 12 
2 16012E 4099 15 
3 16012E 4167 11 
4 16012E 4239 10 
5 16012E 4324 13 
6 16012E 4941 16 
7 16012E 5088 17 
8 16012E 5283  9 
9 16012E 5620  8 
10 16012E 5946 18 
11 16012E 6146  7 
12 16012W 3622 10 
13 16012W 3904 12 
14 16012W 3979 11 
15 16012W 4076  9 
16 16012W 4189 13 
17 16012W 4870 14 
18 16012W 4899 18 
19 16012W 5107 15 
20 16012W 5659  8 
21 16012W 6325  7 
22 16012W 6460 17 
23 16012W 6500 16 

मैं अब इतना है कि मैं अंत में एक ही भूखंड पर यह प्लॉट कर सकते हैं डेटा के बारे में कुछ सामान्य प्रदर्शन करने के लिए चाहते हैं। मैं जो करना चाहता हूं वह एएमवी प्रति श्रृंखला (count_id) के लिए न्यूनतम मान पाता है और फिर दिए गए एएमवी से इस न्यूनतम मान को घटाता है। यह मुझे एक नया कॉलम AMV_norm देगा।

कैसा दिखेगा कौन सा:

count_id AMV Hour AMV_norm 
0 16012E 4004 14   0 
1 16012E 4026 12  22 
2 16012E 4099 15  95 
3 16012E 4167 11  163 
4 16012E 4239 10  235 
5 16012E 4324 13  320 
6 16012E 4941 16  937 
7 16012E 5088 17  1084 
8 16012E 5283  9  1279 
9 16012E 5620  8  1616 
10 16012E 5946 18  1942 
11 16012E 6146  7  2142 
12 16012W 3622 10   0 
13 16012W 3904 12  282 
14 16012W 3979 11  357 
15 16012W 4076  9  454 
16 16012W 4189 13  567 
17 16012W 4870 14  1248 
18 16012W 4899 18  1277 
19 16012W 5107 15  1485 
20 16012W 5659  8  2037 
21 16012W 6325  7  2703 
22 16012W 6460 17  2838 
23 16012W 6500 16  2878 

मैं समारोह श्रृंखला प्रति न्यूनतम AMV मूल्य और नहीं AMV समग्र के न्यूनतम मूल्य पता चलता है कि कैसे परिभाषित करते हैं? यह इस तरह कुछ दिखाई देगा:

def minimum_series_value(AMV): 
    return AMV.argmin() 

मुझे फिर एक नया कॉलम बनाने और उस पंक्ति को एक लैम्ब्डा फ़ंक्शन का उपयोग करने की आवश्यकता होगी। मैं जानता हूँ कि यह कुछ इस तरह दिखेगा:

results_sorted['AMV_norm'] = results_sorted.apply(lambda row:results_sorted(row['AMV'])) 

उत्तर

3

घटाएँ बदलने मिनट से AMV स्तंभ:

In [11]: df.groupby('count_id')["AMV"].transform('min') 
Out[11]: 
0  4004 
1  4004 
2  4004 
3  4004 
4  4004 
... 
21 3622 
22 3622 
23 3622 
dtype: int64 

In [12]: df["AMV"] - df.groupby('count_id')["AMV"].transform('min') 
Out[12]: 
0  0 
1  22 
2  95 
3  163 
4  235 
... 
21 2703 
22 2838 
23 2878 
dtype: int64 

In [13]: df["AMV_norm"] = df["AMV"] - df.groupby('count_id')["AMV"].transform('min') 
+0

धन्यवाद;) बहुत स्पष्ट और सरल – LearningSlowly

1

मेरा मानना ​​है कि आप count_id पर समूहीकृत करना चाहते हैं, और उसके बाद वर्तमान मूल्यों और उस समूह के लिए न्यूनतम मूल्य के बीच का अंतर की गणना।

df['AMV_norm'] = (df.groupby('count_id').AMV 
        .transform(lambda group_series: group_series - np.min(group_series))) 

>>> df 
    count_id AMV Hour AMV_norm 
0 16012E 4004 14   0 
1 16012E 4026 12  22 
2 16012E 4099 15  95 
3 16012E 4167 11  163 
4 16012E 4239 10  235 
5 16012E 4324 13  320 
6 16012E 4941 16  937 
7 16012E 5088 17  1084 
8 16012E 5283  9  1279 
9 16012E 5620  8  1616 
10 16012E 5946 18  1942 
11 16012E 6146  7  2142 
12 16012W 3622 10   0 
13 16012W 3904 12  282 
14 16012W 3979 11  357 
15 16012W 4076  9  454 
16 16012W 4189 13  567 
17 16012W 4870 14  1248 
18 16012W 4899 18  1277 
19 16012W 5107 15  1485 
20 16012W 5659  8  2037 
21 16012W 6325  7  2703 
22 16012W 6460 17  2838 
23 16012W 6500 16  2878 

संपादित: @AndyHayden द्वारा दृष्टिकोण थोड़ा तेज है:

%timeit df["AMV"] - df.groupby('count_id')["AMV"].transform('min') 
1000 loops, best of 3: 736 µs per loop 

%timeit df.groupby('count_id').AMV.transform(lambda x: x - np.min(x)) 
1000 loops, best of 3: 804 µs per loop 

%timeit df.groupby('count_id').AMV.apply(lambda x: x - np.min(x)) 
1000 loops, best of 3: 1.32 ms per loop 
+1

यह एक लैम्ब्डा उपयोग करने के लिए अजीब लगता है जो एक श्रृंखला में एक बदलाव में लौटता है! (आवेदन का उपयोग करने के बजाय।) –

+0

मुझे लगता है कि वे एक ही पथ का उपयोग करते हैं, * लेकिन * ट्रैनफॉर्म आमतौर पर इसका मतलब है कि समूह पर एक मान फैलता है (उदाहरण के लिए ट्रांसफॉर्म ('मिनट')) जबकि लागू होता है कि समूह कुछ भी वापस कर सकता है। लेकिन मुझे यकीन नहीं है, यह मेरी समझ थी। –

+0

दिलचस्प, धन्यवाद। मैं लैम्ब्डा का उपयोग करने में अधिक आरामदायक हूं लेकिन जैसा कि आप कहते हैं एंडी की प्रतिक्रिया तेज है। आपके परिश्रम के लिए धन्यवाद! – LearningSlowly

संबंधित मुद्दे