मैं कुछ डेटा को सारांशित करने की कोशिश कर रहा हूं और फिर फ़िल्टर करने के बाद मैं अंतिम परिणामों के आधार पर एक शब्दकोश आउटपुट करना चाहता हूं।
कृपया नीचे देखें कि मैं अब तक क्या पता लगाने में सक्षम हूं और उन चरणों की व्याख्या जो मैं मदद के लिए देख रहा हूं। अग्रिम में धन्यवाद।
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
x.loc[x["Green_pct"] > 0.5]
प्रश्न 2 में संशोधन करके आगे की फ़िल्टरिंग की जा सकती है। आपके शब्दकोश आउटपुट ने सीमा को()
के बजाय एक सूची में रखा है, जो अधिक कुशल है?.agg(lambda x: tuple(a for v in x for a in [v.left, v.right]))
में बदलकर टुपल्स में अपना आउटपुट प्राप्त कर सकते हैं, यह धीमा/तेज नहीं होना चाहिए - आप जो पसंद करते हैं उस पर निर्भर करता है। प्रश्न 1 के लिए, मुझे समझ नहीं आया। क्या आप विस्तार कर सकते हैं?x.loc[x["Green_pct"] > 0.5 & ["Purple_max "] <30.5 ]
( )
:x.loc[(x["Green_pct"] > 0.5) & (x["Purple_max"] < 30.5)]