मैं कुछ डेटा को सारांशित करने की कोशिश कर रहा हूं और फिर फ़िल्टर करने के बाद मैं अंतिम परिणामों के आधार पर एक शब्दकोश आउटपुट करना चाहता हूं।

कृपया नीचे देखें कि मैं अब तक क्या पता लगाने में सक्षम हूं और उन चरणों की व्याख्या जो मैं मदद के लिए देख रहा हूं। अग्रिम में धन्यवाद।

import pandas as pd
import numpy as np

data = [['New York','Female','Green',523.5,40.614256], ['New York','Female','Green',176.5,46.168092], 
['New York','Male','Green',39.5,58.970444], ['New York','Female','Purple',40.5,40.739437], 
['New York','Male','Purple',12.5,46.854553], ['New York','Male','Green',187.5,59.477795], 
['New York','Male','Green',21.5,59.283682], ['New York','Female','Green',0.5,46.772469],
['New York','Male','Green',48.5,58.847725], ['New York','Female','Purple',17.5,40.642568],
['New York','Male','Green',27.5,46.911063]]

df = pd.DataFrame(data, columns = ['city', 'gender', 'color', 'cm ', 'temp'])

#create `cuts` for `temp`
cuts = np.arange(0, 100.25, 0.25) # range for 'cuts'
df['temp_range'] = pd.cut(df.temp, cuts, include_lowest=True)

print(df)

        city  gender   color    cm        temp     temp_range
0   New York  Female   Green  523.5  40.614256  (40.5, 40.75]
1   New York  Female   Green  176.5  46.168092  (46.0, 46.25]
2   New York    Male   Green   39.5  58.970444  (58.75, 59.0]
3   New York  Female  Purple   40.5  40.739437  (40.5, 40.75]
4   New York    Male  Purple   12.5  46.854553  (46.75, 47.0]
5   New York    Male   Green  187.5  59.477795  (59.25, 59.5]
6   New York    Male   Green   21.5  59.283682  (59.25, 59.5]
7   New York  Female   Green    0.5  46.772469  (46.75, 47.0]
8   New York    Male   Green   48.5  58.847725  (58.75, 59.0]
9   New York  Female  Purple   17.5  40.642568  (40.5, 40.75]
10  New York    Male   Green   27.5  46.911063  (46.75, 47.0]

इस बिंदु पर मैं फंस जाता हूँ।

अटक गया - भाग 1

मैं आगे जो करना चाहता हूं वह एक सारांश तैयार करता है जो निम्नानुसार आउटपुट करता है:

        city  gender      temp_range    Green_count  Purple_count  Green_pct   Green_sum    Purple_sum     Green_max  Purple_max                                    
0   New York  Male     (46.75, 47.0]              1             1       0.50        27.5          12.5          27.5        12.5                                                                                      
1   New York  Male     (58.75, 59.0]              2           NaN       1.00        88.0           NaN          48.5         NaN                                                                                                                  
2   New York  Male     (59.25, 59.5]              2           NaN       1.00       209.0           NaN         187.5         NaN
3   New York  Female   (40.5, 40.75]              1             2       0.33       523.5          58.0         523.5        40.5                                                
4   New York  Female   (46.0, 46.25]              1           NaN       1.00       176.5           NaN         176.5         NaN                                 
5   New York  Female   (46.75, 47.0]              1           NaN       1.00         0.5           NaN           0.5         NaN

....जिसके बाद मैं उदाहरण के लिए निम्नानुसार एक फ़िल्टर लागू करूंगा:

df = df.loc[df['Green_pct'] > 0.5]
df = df.reset_index()

..जो मेरे फ़िल्टर के बाद नीचे के रूप में एक df उत्पन्न करेगा:

        city  gender      temp_range    Green_count  Purple_count  Green_pct   Green_sum    Purple_sum     Green_max  Purple_max                                                                                                                      
0   New York  Male     (58.75, 59.0]              2           NaN       1.00        88.0           NaN          48.5         NaN                                                                                                                  
1   New York  Male     (59.25, 59.5]              2           NaN       1.00       209.0           NaN         187.5         NaN                                            
2   New York  Female   (46.0, 46.25]              1           NaN       1.00       176.5           NaN         176.5         NaN                                 
3   New York  Female   (46.75, 47.0]              1           NaN       1.00         0.5           NaN           0.5         NaN 

अटक गया - भाग 2

... और फिर अंत में, फ़िल्टर किए गए df से डेटा का उपयोग करके मैं एक शब्दकोश आउटपुट करना चाहता हूं जिसे मैं बाद में उपयोग कर सकता हूं

शब्दकोश का प्रारूप इस प्रकार होना चाहिए:

temp_dict = {('New York', Male):(58.75,59.0,59.25,59.5),
                ('New York', Female):(46.0, 46.25,46.75,47.0)}  
1
Diop Chopra 29 अगस्त 2021, 23:19

1 उत्तर

सबसे बढ़िया उत्तर

चरण 1

x = df.pivot_table(
    index=["city", "gender", "temp_range"],
    columns="color",
    values="cm",
    aggfunc={"cm": [lambda x: len(x), lambda x: x.sum(), lambda x: x.max()]},
)
x.columns = x.columns.set_levels(["count", "sum", "max"], level=0)
x = pd.concat(
    [
        x,
        pd.concat(
            {
                "pct": x.xs("count", axis=1).div(
                    x.xs("count", axis=1).sum(1), axis=0
                )
            },
            axis=1,
        ),
    ],
    axis=1,
)
x.columns = x.columns.map(lambda v: "_".join(v[::-1]))

print(x)

प्रिंट:

                               Green_count  Purple_count  Green_sum  Purple_sum  Green_max  Purple_max  Green_pct  Purple_pct
city     gender temp_range                                                                                                   
New York Female (40.5, 40.75]          1.0           2.0      523.5        58.0      523.5        40.5   0.333333    0.666667
                (46.0, 46.25]          1.0           NaN      176.5         NaN      176.5         NaN   1.000000         NaN
                (46.75, 47.0]          1.0           NaN        0.5         NaN        0.5         NaN   1.000000         NaN
         Male   (46.75, 47.0]          1.0           1.0       27.5        12.5       27.5        12.5   0.500000    0.500000
                (58.75, 59.0]          2.0           NaN       88.0         NaN       48.5         NaN   1.000000         NaN
                (59.25, 59.5]          2.0           NaN      209.0         NaN      187.5         NaN   1.000000         NaN

चरण 2

x = (
    x.loc[x["Green_pct"] > 0.5]
    .reset_index()
    .groupby(["city", "gender"])["temp_range"]
    .agg(lambda x: [a for v in x for a in [v.left, v.right]])
    .to_dict()
)
print(x)

प्रिंट:

{
    ("New York", "Female"): [46.0, 46.25, 46.75, 47.0],
    ("New York", "Male"): [58.75, 59.0, 59.25, 59.5],
}
1
Andrej Kesely 29 अगस्त 2021, 23:59
1
अच्छाई मुझे!! डॉक्टर ने क्या आदेश दिया !! मेरे दो प्रश्न हैं 1. एकल x.loc[x["Green_pct"] > 0.5] प्रश्न 2 में संशोधन करके आगे की फ़िल्टरिंग की जा सकती है। आपके शब्दकोश आउटपुट ने सीमा को () के बजाय एक सूची में रखा है, जो अधिक कुशल है?
 – 
Diop Chopra
30 अगस्त 2021, 00:15
प्रश्न 2 के लिए: आप .agg(lambda x: tuple(a for v in x for a in [v.left, v.right])) में बदलकर टुपल्स में अपना आउटपुट प्राप्त कर सकते हैं, यह धीमा/तेज नहीं होना चाहिए - आप जो पसंद करते हैं उस पर निर्भर करता है। प्रश्न 1 के लिए, मुझे समझ नहीं आया। क्या आप विस्तार कर सकते हैं?
 – 
Andrej Kesely
30 अगस्त 2021, 00:20
सुधार प्रश्न 2 के संबंध में सब ठीक है। प्रश्न 1 हालांकि, मैं उदाहरण के लिए अतिरिक्त फ़िल्टर जोड़ने में असमर्थ हूं x.loc[x["Green_pct"] > 0.5 & ["Purple_max "] <30.5 ]
 – 
Diop Chopra
30 अगस्त 2021, 01:02
शर्तों को अंदर रखें ( ): x.loc[(x["Green_pct"] > 0.5) & (x["Purple_max"] < 30.5)]
 – 
Andrej Kesely
30 अगस्त 2021, 01:04